我正在使用 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 答案并在应用程序中有一个单一的数据库类吗?
这是我得到的错误:
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)