[英]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 中顯示錯誤,而您提供的查詢將被遺忘...
所以,我建議:
在整個應用程序中使用單個連接。 看這里:
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.