我正在寫一個使用sqlite
的android應用程序。有很多活動和一項服務。我使用來自多個線程的數據庫。它完美的Android 2.X
,但一旦我在Android 3.X
運行它,它總是拋出這個錯誤,Force Close
:多線程的Android sqlite
05-04 22:17:04.815: I/SqliteDatabaseCpp(8774): sqlite returned: error code = 5, msg = database is locked, db=/data/data/xxx/databases/im
05-04 22:17:04.815: E/SqliteDatabaseCpp(8774): sqlite3_open_v2("/data/data/xxx/databases/im", &handle, 6, NULL) failed
05-04 22:17:04.835: E/SQLiteDatabase(8774): Failed to open the database. closing it.
05-04 22:17:04.835: E/SQLiteDatabase(8774): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:790)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
任何人都知道它爲什麼會發生,以及如何解決呢?
我已經研究在互聯網和大多數人建議:僅對應用
- 使用一個數據庫連接。如何確保它?我想共享服務和活動的數據庫連接。我應該通過創建一個公共靜態DB變量來完成嗎?
- ContentProvider - 我在代碼中使用複雜的SQL語句(如加入少量表格,臨時表格)。是否有可能在ContentProvider中運行這些複雜的SQL語句?
謝謝大家。最後,(1)對我很好。但我仍然想知道爲什麼Android 2.X沒有這個問題。
1)僅在所有訪問都是在同一進程中發生時纔有效,2)只要您需要插入/查詢/更新/刪除即可使用,但複雜查詢看起來很難看,因爲您僅限於http://開發人員.android.com/reference/android/content/ContentResolver.html接口 – zapl
謝謝zapl,數據庫不與其他應用程序共享。我認爲(1)對我有好處。你有什麼想法爲什麼Android 2.X沒有這個問題? –
你應該去這個鏈接http://stackoverflow.com/questions/7930139/android-databse-locked –