[英]Room - Database gets locked after a delete query
I'm trying to delete a row from my database.我正在尝试从我的数据库中删除一行。 When I first delete it for the first time, the row gets removed successfully.
当我第一次删除它时,该行被成功删除。 After I try to remove another row, I get an error that the db is not open/ is locked.
在我尝试删除另一行后,我收到一个错误,即数据库未打开/已锁定。 I have posted the logcat and the code.
我已经发布了 logcat 和代码。
Also, if I delete a row for the first time, it gets delete and when I close the app and open it back again and delete another row, it works.此外,如果我第一次删除一行,它会被删除,当我关闭应用程序并再次打开它并删除另一行时,它会起作用。 Only if I continue to delete another row without closing the app, I get the error.
只有当我在不关闭应用程序的情况下继续删除另一行时,我才会收到错误消息。
Here's the log:这是日志:
Caused by: java.lang.IllegalStateException: The database '/data/user/0/com.basusingh.blingoo/databases/wordLayList' is not open.
at android.database.sqlite.SQLiteDatabase.throwIfNotOpenLocked(SQLiteDatabase.java:2943)
at android.database.sqlite.SQLiteDatabase.createSession(SQLiteDatabase.java:564)
at android.database.sqlite.-$$Lambda$RBWjWVyGrOTsQrLCYzJ_G8Uk25Q.get(Unknown Source:2)
at java.lang.ThreadLocal$SuppliedThreadLocal.initialValue(ThreadLocal.java:284)
at java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:180)
at java.lang.ThreadLocal.get(ThreadLocal.java:170)
at android.database.sqlite.SQLiteDatabase.getThreadSession(SQLiteDatabase.java:558)
at android.database.sqlite.SQLiteProgram.getSession(SQLiteProgram.java:123)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
at androidx.sqlite.db.framework.FrameworkSQLiteStatement.executeUpdateDelete(FrameworkSQLiteStatement.java:46)
at com.basusingh.blingoo.Database.WordLayList.WordLayListDao_Impl.DeleteWordLayList(WordLayListDao_Impl.java:94)
at com.basusingh.blingoo.Activity.WordLayListViewer$1doTask.doInBackground(WordLayListViewer.java:156)
at com.basusingh.blingoo.Activity.WordLayListViewer$1doTask.doInBackground(WordLayListViewer.java:148)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
E/ROOM: Cannot run invalidation tracker. Is the db closed?
android.database.sqlite.SQLiteException: no such table: room_table_modification_log (code 1 SQLITE_ERROR[1]): , while compiling: SELECT * FROM room_table_modification_log WHERE invalidated = 1;
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1229)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:703)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1865)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1840)
at androidx.sqlite.db.framework.FrameworkSQLiteDatabase.query(FrameworkSQLiteDatabase.java:161)
at androidx.room.RoomDatabase.query(RoomDatabase.java:328)
at androidx.room.RoomDatabase.query(RoomDatabase.java:311)
at androidx.room.InvalidationTracker$1.checkUpdatedTable(InvalidationTracker.java:415)
at androidx.room.InvalidationTracker$1.run(InvalidationTracker.java:389)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Here's the DAO code:这是DAO代码:
@Dao
public interface WordLayListDao {
@Query("DELETE FROM WordLayListItems WHERE uid = :id")
void DeleteWordLayList(int id);
}
And other class,等class,
public class WordLayListDatabaseClient {
private Context mCtx;
private static WordLayListDatabaseClient mInstance;
private WordLayListAppDatabase appDatabase;
private WordLayListDatabaseClient(Context mCtx) {
this.mCtx = mCtx;
appDatabase = Room.databaseBuilder(mCtx, WordLayListAppDatabase.class, "wordLayList").build();
}
public static synchronized WordLayListDatabaseClient getInstance(Context mCtx) {
if (mInstance == null) {
mInstance = new WordLayListDatabaseClient(mCtx);
}
return mInstance;
}
public WordLayListAppDatabase getAppDatabase() {
return appDatabase;
}
}
@Database(entities = {WordLayListItems.class}, version = 1)
public abstract class WordLayListAppDatabase extends RoomDatabase {
public abstract WordLayListDao wordLayListDao();
}
This is how I'm calling the database:这就是我调用数据库的方式:
private void deleteLayList(){
class doTask extends AsyncTask<Void, Void, String> {
@Override
protected void onPreExecute(){
progressDialog.setTitle("Please wait");
progressDialog.show();
}
@Override
protected String doInBackground(Void... aa){
WordLayListDatabaseClient.getInstance(WordLayListViewer.this).getAppDatabase().wordLayListDao().DeleteWordLayList(o.getID());
return null;
}
@Override
protected void onPostExecute(String var){
progressDialog.dismiss();
Toast.makeText(getApplicationContext(), "WordLay List Deleted", Toast.LENGTH_LONG).show();
setResult(RESULT_OK);
finish();
}
}
doTask dt = new doTask();
dt.execute();
}
I've solved the issue this way.我已经通过这种方式解决了这个问题。
Instead of using the singleton class to insert or delete, I'm simply calling this code directly:我没有使用 singleton class 来插入或删除,而是直接调用此代码:
WordLayListAppDatabase db = Room.databaseBuilder(getApplicationContext(),
WordLayListAppDatabase.class, "wordLayList").build();
db.wordLayListDao().DeleteWordLayListByObject(o);
Now, I'm using the singleton class to only fetch the data.现在,我使用 singleton class 仅获取数据。 To update the database, I'm using the code above (The above is always called in Async Task).
为了更新数据库,我使用了上面的代码(上面总是在异步任务中调用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.