我有碎片,在那裏我緩存在每一個片段的數據。我在從服務器doInBackground方法下載其緩存數據在的AsyncTask,它在onPostExecute保存到我的數據庫。所以我總是在onPostExecution中打開數據庫連接。如果我滾動「快速」扔碎片,我認爲AsyncTasks通過預覽實例,將有一排android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
在那裏我打開連接(獲得dbHelper.getWritableDatabase()
)的Android的AsyncTask鎖定數據庫
我認爲有兩種方法來解決這樣的:
的onPostExecution方法要等到預覽的AsyncTask(onPostExecution)是完成
有使用的的AsyncTask的所有實例相同的數據庫連接的方式,沒有鎖定他們的海誓山盟
這是正確的嗎?有人有一個想法,該怎麼做?
感謝您的幫助! 不知道爲什麼,但我曾經以爲只能訪問主線程中的文件系統,其中onPostExecute,而不是doInBackground正在運行。我很驚訝地看到,它也在這裏工作!我現在用事務包圍了我所有的sql查詢。永遠不要關閉遊標(這是通過引用的帖子中的鏈接推薦的,[單個SQLite連接](http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection))解決了鎖定問題一方面,但另一方面它似乎是一個骯髒的伎倆。或者我錯了? – lis
「永不關閉遊標」是什麼意思? AFAIK遊標必須關閉,否則Android會投訴(通常非常大聲,尤其是2.2),甚至會引發異常。你可能是指「從不關閉SQLiteDatabase」?如果是這樣,那就沒問題了:在我的應用程序中,我使用保存在應用程序中的數據庫單例,它工作正常(事實上,在多個數據庫實例出現一些不好的體驗後,我轉向了這種方法)。希望它有幫助 – Rick77