[英]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.