3

"Service"次の例外で失敗する SQLiteDatabase を開こうとしています:

10-21 19:33:23.547: E/SqliteDatabaseCpp(31208): sqlite3_exec - Failed to set synchronous mode = 1(Normal) 
10-21 19:33:23.547: E/SQLiteDatabase(31208): Failed to open the database. closing it.
10-21 19:33:23.547: E/SQLiteDatabase(31208): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
10-21 19:33:23.547: E/SQLiteDatabase(31208):    at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
10-21 19:33:23.547: E/SQLiteDatabase(31208):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1135)
10-21 19:33:23.547: E/SQLiteDatabase(31208):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1086)
10-21 19:33:23.547: E/SQLiteDatabase(31208):    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1173)
10-21 19:33:23.547: E/SQLiteDatabase(31208):    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:858)
10-21 19:33:23.547: E/SQLiteDatabase(31208):    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:228)
10-21 19:33:23.547: E/SQLiteDatabase(31208):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)

誰かがこれが何を意味するのか説明してもらえますか? どうすれば修正できますか?データベースがMainActivityおよびで開かれますService

4

2 に答える 2

2

データベースが1つのスレッド(アクティビティ?)によって使用(ロック)され、他のスレッド(サービス?)がそれを使用(ロック)しようとしたが失敗したときに発生したアクセス競合だと思います。

独自の SQLiteOpenHelper をシングルトン クラスにして、それをアクティビティとサービスの間で共有すると、クラスが競合を適切に処理します。このスレッドの議論を参照してください

于 2012-10-22T03:32:24.387 に答える
0

データベースを再度開こうとしたときに、データベースが他のスレッドによって開かれているが、閉じられていないかどうかを確認してください。はいの場合は、使用後に閉じてみてください。

于 2012-10-22T03:41:38.723 に答える