Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 房间-数据库在删除查询后被锁定_Java_Android_Database_Sqlite_Android Room - Fatal编程技术网

Java 房间-数据库在删除查询后被锁定

Java 房间-数据库在删除查询后被锁定,java,android,database,sqlite,android-room,Java,Android,Database,Sqlite,Android Room,我正在尝试从数据库中删除一行。当我第一次删除它时,该行被成功删除。尝试删除另一行后,我得到一个错误,即数据库未打开/已锁定。我已经发布了日志和代码 此外,如果我第一次删除一行,它会被删除,当我关闭应用程序并再次打开它并删除另一行时,它会工作。只有在不关闭应用程序的情况下继续删除另一行时,才会出现错误 这是日志: Caused by: java.lang.IllegalStateException: The database '/data/user/0/com.basusingh.bli

我正在尝试从数据库中删除一行。当我第一次删除它时,该行被成功删除。尝试删除另一行后,我得到一个错误,即数据库未打开/已锁定。我已经发布了日志和代码

此外,如果我第一次删除一行,它会被删除,当我关闭应用程序并再次打开它并删除另一行时,它会工作。只有在不关闭应用程序的情况下继续删除另一行时,才会出现错误

这是日志:

     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)
和其他类

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;
    }
}

这是我如何调用数据库的:

 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();
    }
private void deleteLayList(){
类doTask扩展异步任务{
@凌驾
受保护的void onPreExecute(){
progressDialog.setTitle(“请稍候”);
progressDialog.show();
}
@凌驾
受保护的字符串背景(无效…aa){
WordLayListDatabaseClient.getInstance(WordLayListViewer.this).getAppDatabase().wordLayListDao().DeleteWordLayList(o.getID());
返回null;
}
@凌驾
受保护的void onPostExecute(字符串变量){
progressDialog.disclose();
Toast.makeText(getApplicationContext(),“WordLay列表已删除”,Toast.LENGTH_LONG.show();
设置结果(结果\正常);
完成();
}
}
doTask dt=新的doTask();
dt.execute();
}

我用这种方法解决了这个问题

我没有使用singleton类来插入或删除,而是直接调用以下代码:

 WordLayListAppDatabase db = Room.databaseBuilder(getApplicationContext(),
                        WordLayListAppDatabase.class, "wordLayList").build();
                db.wordLayListDao().DeleteWordLayListByObject(o);

现在,我使用singleton类只获取数据。要更新数据库,我使用上面的代码(上面的代码总是在异步任务中调用)。

第一次删除后,您是否尝试过检查数据库?它是否成功删除,查看logcat它意味着您试图在数据库关闭时删除它。很可能是第一次删除后第一次出错是的,我已经检查过了。它已成功删除。我从数据库中获取更新的列表。您是否尝试过删除但未使用AsyncTask?还没有。我今天要试试。还有其他想法吗?没有,通常我会使用房间的内置查询删除对象。是@delete这怎么行?您是否为此使用了两个不同的db实例?LiveData对u正常工作吗?
 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();
    }
 WordLayListAppDatabase db = Room.databaseBuilder(getApplicationContext(),
                        WordLayListAppDatabase.class, "wordLayList").build();
                db.wordLayListDao().DeleteWordLayListByObject(o);