2013-04-26 29 views
1

我有一個SQLite數據庫,它在我的應用程序中收到了一些重要的用處。它是從訪問:Jellybean中的Android SQLite數據庫事務/鎖定更改

  • 各種活動,經由ASyncTasks將數據加載到所述UI(SELECT語句只)
  • 幾個後臺進程(僅其中之一可以一次運行),其做很多插入/更新

我調用getWritableDatabase()一次,並在任何地方使用它。每個後臺進程都使用IMMEDIATE(即非鎖定)事務,這些事務將其中一些事務從幾分鐘加速到幾秒鐘。

這一切都工作完美前jellybean;後臺進程具有事務的速度優勢,但這並未阻止Activites通過ASyncTasks加載數據。

Post-Jellybean,當事務正在進行時,GUI的每個ASyncTask加載數據都被阻塞,因此通常不會返回幾秒鐘。這導致導航緩慢和令人沮喪。我已經隔離了對rawQuery數據庫調用的阻塞。

我無法找到指定確切的任何文檔什麼傑利貝恩改變,不是被棄用的幾種方法等 - http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#isDbLockedByOtherThreads() - 與像評論「不再有數據庫鎖的概念,所以此方法始終返回false 「。

有沒有簡單的方法來模仿前軟糖豆的行爲?

回答

1

我已經找到了解決我自己的問題。 我仍然不確定谷歌已經改變了什麼軟糖,以阻止現在工作之前的工作 - 但解決方案是使用enableWriteAheadLogging()

我以前試過這個,無濟於事 - 在交易正在進行時,我仍然遇到封鎖讀取。對我來說重要的是(在enableWriteAheadLogging()文檔中)

如果數據庫有任何附加的數據庫,那麼並行執行查詢是不可能的。

不幸的是,我的應用程序有兩個獨立的數據庫連接在一起允許連接的查詢 - enableWriteAheadLogging()返回false。我已經原型刪除附件,並解決了阻塞問題;我的select查詢全部運行,而另一個線程運行IMMEDATE事務。

不幸的是,我將不得不重新設計我的數據庫模式以實現完整的修復。

1

看起來,預果凍豆異步任務並行運行。現在你已經有一個Executor在封面下連續運行異步任務。好消息是,您可以通過基於操作系統版本的分支來指定您的任務如何運行。

閱讀this article

+0

謝謝,但我已經在使用ICS及更高版本的AsyncTask.THREAD_POOL_EXECUTOR。在這種情況下,記錄將rawQuery調用隔離爲阻塞程序。 – pennas 2013-04-27 09:32:19