2011-12-09 97 views
1

如果他們只對它執行查詢?喜歡的東西:兩個AsyncTasks可以共享相同的SQLiteDatabase對象嗎?

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); 
     ... 
    } 
} 
+1

相關http://stackoverflow.com/questions/4498664/android-multiple-databases-open http://stackoverflow.com/questions/4234030/android-can-i-use-one-sqliteopenhelper-class- for-multiple-database-files和http://stackoverflow.com/questions/1556930/sharing-sqlite-database-between-multiple-android-activities – Gray

回答

8

你的線程的所有應用程序中應該使用相同的數據庫對象 - 即使同時讀取和寫入。 SQLite通過適當的內部鎖定機制處理這個問題。

不要想做的就是使用多個數據庫對象從數據庫中讀寫。這可能會導致數據不一致。

在這裏看到:

最後一條鏈路是一個很好的一個。引用Kevin Galligan:

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

以下是缺少的東西。如果您嘗試同時從實際不同的連接寫入數據庫,則會失敗。它不會等到第一個完成後才寫。它不會寫你的改變。更糟糕的是,如果你沒有在SQLiteDatabase上調用正確版本的insert/update,你將不會得到異常。你只需要在你的LogCat中獲得一條消息,就是這樣。

另外,凱文已經完成了Android支持Android的Android ORP包ORMLite的一小部分工作。

+0

謝謝,我擔心會發生某種「碰撞」 「如果兩個AsyncTask試圖同時寫入,但我想你的答案會清除它。 –

+0

我有類似的問題,我實際上是從兩個或更多的AsyncTasks在至少有兩個executionOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)..,我得到以下崩潰同時閱讀「java.lang.IllegalStateException:無法執行此操作,因爲連接池已關閉「。猜猜它與在每次查詢之前獲取可讀數據庫並在它關閉之後關聯,以便AsyncTasks重疊,並且一個正在訪問錯誤時刻的光標:S – Ewoks

相關問題