簡體   English   中英

兩個AsyncTasks可以共享同一個SQLiteDatabase對象嗎?

[英]Can two AsyncTasks share the same SQLiteDatabase object?

如果他們只對它執行查詢呢? 就像是:

private SQLiteDatabase db;

@Override
public void onCreate(Bundle savedInstanceState) {
    db = getWritableDatabse();
}

private Task1 extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... arg0) {
        db.query(doSomething);
        ...
    }
}

private Task2 extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... arg0) {
        db.query(doSomething);
        ...
    }
}

您的應用程序中的所有線程都應使用相同的數據庫對象-即使同時讀寫。 SQLite通過內部鎖定機制適當地處理了這一問題。

什么你不想做的就是使用多個數據庫對象閱讀並從數據庫中寫入。 這可能會導致數據不一致。

看這里:

最后一個鏈接是一個很好的鏈接。 引用Kevin Galligan的話:

  • Sqlite負責文件級鎖定。 許多線程可以讀取,一個線程可以寫入。 這些鎖可以防止多次書寫。
  • Android在SQLiteDatabase中實現了一些Java鎖定,以幫助保持正直。
  • 如果您發瘋並從許多線程中錘擊數據庫,則數據庫(或應該)不會損壞。

這是缺少的東西。 如果您嘗試同時從實際的不同連接中寫入數據庫,則連接將失敗。 它不會等到第一個完成后再寫。 它根本不會寫您的更改。 更糟糕的是,如果您沒有在SQLiteDatabase上調用正確版本的insert / update,您將不會獲得異常。 您只會在LogCat中收到一條消息,僅此而已。

順便說一句 ,Kevin在ORMLite的Android方面做了很多工作, ORMLite是我的支持Android的Java ORM軟件包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM