私は SQLiteOpenHelper を使用して、Android 上の SQlite データベースから読み書きしています。ユーザーがUIをクリックすると、AsyncTaskを使用してSQLiteデータベースから読み取りますが、正確な瞬間に、他のAsyncTaskを使用してバックグラウンドでデータベースを更新して書き込みます。
x回ごとにデータベースロック例外が発生します。どうすればこれを修正できますか? 複数のスレッドから同時にSQliteにアクセスすることはできますか?
私はそのように使用しています: SQLiteOpenHelper から拡張されたデータベース クラスがあります。onCreate および onUpgrade メソッドを実装し、データベースからの読み取りまたはデータベースへの書き込みを行うたびに、次のように SQLiteDatabase を使用します。
SQLiteDatabase database = null;
try {
database = new Database(context).getWritableDatabase();
....
writing and reading from database...
....
} catch (Exception e) {
e.printStackTrace();
} finally {
if (database != null) {
database.close();
}
}
最後に、使用する場合は SQLiteStatements と Cursors も閉じます。@Justin answer を使用して、アプリケーションにデータベース クラスのシングルトンを設定する必要がありますか?
これは私が得るエラーです:
E/SqliteDatabaseCpp(17377): sqlite3_open_v2("/data/data/com.skulptur/databases/LGM.s3db", &handle, 6, NULL) failed
E/SQLiteDatabase(17377): Failed to open the database. closing it.
E/SQLiteDatabase(17377): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
E/SQLiteDatabase(17377): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:750)
E/SQLiteDatabase(17377): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
E/SQLiteDatabase(17377): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:223)