簡體   English   中英

Android 數據庫已鎖定

[英]Android Database Locked

我收到以下錯誤。 那么如何解鎖我的數據庫呢?

10-28 08:43:26.510: ERROR/AndroidRuntime(881): FATAL EXCEPTION: Thread-11
10-28 08:43:26.510: ERROR/AndroidRuntime(881): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:742)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at com.aa.me.vianet.dbAdapter.DbAdapter.open(DbAdapter.java:25)
10-28 08:43:26.510: ERROR/AndroidRuntime(881):     at com.aa.me.vianet.services.NotificationManagerThread.run(NotificationManagerThread.java:49)

我認為您忘記關閉數據庫,或者當您嘗試寫入數據庫時​​另一個線程正在寫入數據庫。 SQLite在寫入數據庫時​​鎖定數據庫,以避免在另一個實體同時嘗試寫入同一數據庫時發生損壞。 Android,只會在 log cat 中顯示錯誤,而您提供的查詢將被遺忘...

所以,我建議:

  • 您只能從一個SQLOpenHelper訪問數據庫
  • 確保在完成數據庫助手的所有實例后關閉它們
  • 如果您沒有將它們設置為成功(即,如果您想回滾它們endTransaction() ,您也確保始終使用endTransaction()結束交易,以防您使用交易
  • 您可以嘗試使用OrmLite ,我沒有使用過它,但我聽說這里的其他人對它贊不絕口

在整個應用程序中使用單個連接。 看這里:

http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

發生這種情況的原因是您一次只能打開一個與數據庫的連接(這是為了防止修改數據庫時出現競爭條件)。 我猜你從不同的線程多次連接到你的數據庫? 解決這個問題的最簡單方法是為您的數據庫創建一個ContentProvider前端。 這將能夠處理來自多個線程的查詢。

有關更多信息,請查看此博文

我有同樣的問題,嘗試使用這個

   db.beginTransactionNonExclusive();
   try {
       //do some insertions or whatever you need
       db.setTransactionSuccessful();
   } finally {
       db.endTransaction();
   }

我嘗試使用 db.beginTransaction 但它鎖定了 bd

我有一個類似的錯誤。 我的問題是我不小心給了兩個助手類的數據庫同名,因此它們最終同時訪問了同一個數據庫。 因此,請確保您沒有訪問具有多個幫助程序類的單個數據庫。

我遇到了同樣的問題,因為我試圖通過ContentResolver訪問我的數據庫,而我已經有一個直接的SQLiteDatabase連接打開它(事務需要)。

我通過更改代碼的順序解決了這個問題,以便在SQLiteDatabase我的直接SQLiteDatabase連接之前完成ContentResolver的工作。

我還刪除了一些代碼,所以我不再關閉我的直接SQLiteDatabase

值得閱讀此答案,因為它提供了許多其他有用的指導。

就我而言,此錯誤是由於常見錯誤造成的。 最初,我的 SQLite 數據庫由從 MySQL 的 JsonArray 接收的數據填充。 在 SQLite 數據庫中添加附加列后,發生了類似的錯誤。 簡單地說,我忘了在 MySQL 數據庫中添加相應的列.. :)

當我們被拋出如下錯誤時我們可以做些什么。

android.database.sqlite.SQLiteDatabaseLockedException:數據庫被鎖定

數據庫鎖意味着數據庫正在與其他一些線程一起執行任務,同時其他線程在該任務發生時執行。

所以在我的情況下的解決方案是:

您必須在像這樣在數據庫中執行查詢或執行事務之前進行檢查。

if(!sqLiteDatabase.isDbLockedByCurrentThread() && !sqLiteDatabase.isDbLockedByOtherThreads()) 

暫無
暫無

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

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