簡體   English   中英

Android - 數據庫已鎖定

[英]Android - Database is Locked

我有一個應用程序,我可以將數據插入SQLite數據庫。 每六十秒運行一次服務線程,檢查條件是否為真,並在必要時發出警報。 想想“日歷”應用程序。

我有很多活動,他們引用了自己的SQLiteOpenHelper和他們自己的SQLiteDatabase對象。

該應用程序工作得很好,但我決定的主要更新應用程序之一需要一個進度對話主題 - 這是另一個主題,但如果你能告訴我如何讓旋轉器旋轉那就太好了。 然而它顯示。

但為了讓它顯示,我需要把它放在一個線程中。

創建這個線程,我開始在日志中獲得大量“數據庫被鎖定”的消息。

我認為這個問題可能與我在后台運行每60秒運行一次的事實有關 - 即使它在視覺上只需要幾秒鍾來進行更新,所以我將更新器功能的主要寫入事務放入一個beginTransaction塊。 這是我用過的唯一一個地方。

一切似乎都很好,但后來我開始得到關於數據庫被鎖定在整個地方的更多虛假錯誤。

我鼓勵我做一些整理,但似乎在我做了第一次beginTransaction之后,我想做的任何進一步的數據庫修改都失敗了,數據庫被鎖定的報告,盡管我確實調用了db.close。 我甚至關閉數據庫助手對象和光標只是為了安全起見。

我能夠清除關於游標仍處於打開狀態的大多數警告,例如

E/Database(  678): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

當一切都被關閉時,我無法弄清楚鎖定數據庫的原因。

然后我決定刪除“beginTransaction”,這樣可以穩定事物 - 我現在可以再次瀏覽我的程序。 但我仍然得到一些隨機鎖定問題。

E/Database( 1304): Failure 5 (database is locked) on 0x26e5d8 when executing 'INSERT INTO

是否有可能找出鎖定數據庫的內容? 我可以看到關於鎖的抱怨,但不是鎖定它的是什么。

處理這樣的並發數據庫更新/讀取的最佳方法是什么? 我已經閱讀了很多關於synchronized和ContentProviders的內容,但我必須承認,這對我來說有點大。

有關“最佳”做事方式的任何指示?

我能找出鎖定數據庫的內容嗎?

謝謝西蒙

NAME類擴展了SQLiteOpenHelper

加:

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
      if (!db.isReadOnly()) {
          db.execSQL("PRAGMA foreign_keys=ON;");
          Cursor c = db.rawQuery("PRAGMA foreign_keys", null);
             if (c.moveToFirst()) {
                 int result = c.getInt(0);
             }
             if (!c.isClosed()) {
                    c.close();
             }        
      }
}

您可能希望查看最新版本的Berkeley DB作為選項。 它提供了與SQLite3兼容的SQL API(以便您的應用程序保持不變),並提供更精細的鎖定粒度,從而提高並發性。 Berkeley DB支持多個並發讀寫線程,以便同時主動訪問數據庫。 您可以在我們的網站上找到有關Berkeley DB的更多信息。

暫無
暫無

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

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