Как устранить ошибку при усечении таблиц базы данных комнаты - PullRequest
0 голосов
/ 14 мая 2019

Я хотел урезать все таблицы из базы данных.Я использую комнатную постоянную библиотеку.Я вызываю метод truncateDatabase () по нажатию кнопки.Это иногда делает работу успешно, но иногда выдает ошибки.Я много искал, но очень мало ресурсов по этой проблеме.Пожалуйста, помогите мне решить эту проблему.

Я испробовал оба подхода:

  1. Вызов db.clearAllTables ();
  2. Удаление с помощью SQL-запроса db.settingsDao () .deleteAll ();

Файл SettingsDao.class:

@Dao
 public interface SettingsDao {
    ... 
    @Query("DELETE FROM settings")
    void deleteAll();
    ...
}

Вот код файла AppDatabase:

 @Database(entities = {Settings.class, ....}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
    private static final String TAG = "AppDatabase";
    public static String DATABASE_NAME = ....;

    public abstract SettingsDao settingsDao();
    ....

    public static AppDatabase instance;

    public static synchronized AppDatabase getInstance(Context context) {
        if (instance == null) {
            instance = Room.databaseBuilder(context.getApplicationContext(),
                    AppDatabase.class, DATABASE_NAME)
                    .fallbackToDestructiveMigration()
                    .addCallback(roomCallback)
                    .build();
        }
        return instance;
    }

    .....

    public void truncateDatabase() {
        Log.d(TAG, "Truncate Database");
        if (isOpen()) {
            Log.d(TAG, "Database is opened");
            new TruncateAndInitializeAsyncTask(instance).execute();
        }
    }

    private class TruncateAndInitializeAsyncTask extends AsyncTask<Void, 
Void, Void> {
        AppDatabase db;

        private TruncateAndInitializeAsyncTask(AppDatabase db) {
            this.db = db;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            Log.d(TAG, "Truncate tables from database "+isOpen()+db.isOpen());
            if (isOpen()) {
                Log.d(TAG, "Database is opened "+db.isOpen());
//                db.clearAllTables();
                try {
                    db.settingsDao().deleteAll();
                    ....
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            ....
        }
    }
}

Ошибки Logcat:

D/AppDatabase: Truncate Database
D/AppDatabase: Database is opened
D/AppDatabase: Truncate tables from database truetrue
D/AppDatabase: Database is opened true
E/SQLiteLog: (1) no such table: room_table_modification_log
E/ROOM: Cannot run invalidation tracker. Is the db closed?
android.database.sqlite.SQLiteException: no such table: room_table_modification_log (code 1): , while compiling: INSERT OR IGNORE INTO room_table_modification_log VALUES(3, 0)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1678)
    at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1608)
    at androidx.sqlite.db.framework.FrameworkSQLiteDatabase.execSQL(FrameworkSQLiteDatabase.java:242)
    at androidx.room.InvalidationTracker.startTrackingTable(InvalidationTracker.java:231)
    at androidx.room.InvalidationTracker.syncTriggers(InvalidationTracker.java:518)
    at androidx.room.RoomDatabase.beginTransaction(RoomDatabase.java:329)
    at ....Database.Dao.SettingsDao_Impl.deleteAll(SettingsDao_Impl.java:130)
    at ....Database.AppDatabase$TruncateAndInitializeAsyncTask.doInBackground(AppDatabase.java:336)
    at ....Database.AppDatabase$TruncateAndInitializeAsyncTask.doInBackground(AppDatabase.java:321)
    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:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)
W/System.err:     java.lang.IllegalStateException: The database '/data/user/0/.../databases/MONEY_MANAGER_DB' is not open.
W/System.err:     at android.database.sqlite.SQLiteDatabase.throwIfNotOpenLocked(SQLiteDatabase.java:2188)
W/System.err:     at android.database.sqlite.SQLiteDatabase.createSession(SQLiteDatabase.java:367)
W/System.err:     at android.database.sqlite.SQLiteDatabase$1.initialValue(SQLiteDatabase.java:86)
E/SQLiteLog: (1) no such table: room_table_modification_log
W/System.err:     at android.database.sqlite.SQLiteDatabase$1.initialValue(SQLiteDatabase.java:84)
W/System.err:     at java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:180)
W/System.err:     at java.lang.ThreadLocal.get(ThreadLocal.java:170)
W/System.err:     at android.database.sqlite.SQLiteDatabase.getThreadSession(SQLiteDatabase.java:361)
W/System.err:     at android.database.sqlite.SQLiteProgram.getSession(SQLiteProgram.java:101)
W/System.err:     at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
W/System.err:     at androidx.sqlite.db.framework.FrameworkSQLiteStatement.executeUpdateDelete(FrameworkSQLiteStatement.java:46)
W/System.err:     at ....Database.Dao.SettingsDao_Impl.deleteAll(SettingsDao_Impl.java:132)
W/System.err:     at com....Database.AppDatabase$TruncateAndInitializeAsyncTask.doInBackground(AppDatabase.java:336)
W/System.err:     at com.....Database.AppDatabase$TruncateAndInitializeAsyncTask.doInBackground(AppDatabase.java:321)
W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:333)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
E/ROOM: Cannot run invalidation tracker. Is the db closed?
android.database.sqlite.SQLiteException: no such table: room_table_modification_log (code 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:889)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1318)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1293)
    at androidx.sqlite.db.framework.FrameworkSQLiteDatabase.query(FrameworkSQLiteDatabase.java:161)
    at androidx.room.RoomDatabase.query(RoomDatabase.java:305)
    at androidx.room.InvalidationTracker$1.checkUpdatedTable(InvalidationTracker.java:428)
    at androidx.room.InvalidationTracker$1.run(InvalidationTracker.java:400)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)
...