RoomDatabase аварийно завершает работу во время миграции, хотя для Database задано значение fallbackToDestructiveMigration - PullRequest
0 голосов
/ 05 октября 2019

Мы видим больше сбоев в Fabric во время миграции RoomDatabase. Любое предложение по устранению проблемы

Инициализация RoomDatabase:

companion object {
        fun createNotesDatabase(androidContext: Context): NotesDatabase {
            try {
                return Room.databaseBuilder(androidContext, NotesDatabase::class.java, "notesdb")
                    .fallbackToDestructiveMigration()
                    .build()
            } catch (e: Exception) {
                Log.e("NotesDatabase", "exception")
            }
        }
    }

Трассировка стека за исключением:

Fatal Exception: java.lang.IllegalStateException: A migration from 1 to 4 was required but not found. Please provide the necessary Migration path via RoomDatabase.Builder.addMigration(Migration ...) or allow for destructive migrations via one of the RoomDatabase.Builder.fallbackToDestructiveMigration* methods.
       at android.arch.persistence.room.RoomOpenHelper.onUpgrade + 97(RoomOpenHelper.java:97)
       at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade + 133(FrameworkSQLiteOpenHelper.java:133)
       at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked + 400(SQLiteOpenHelper.java:400)
       at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase + 298(SQLiteOpenHelper.java:298)
       at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase + 96(FrameworkSQLiteOpenHelper.java:96)
       at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase + 54(FrameworkSQLiteOpenHelper.java:54)
       at com.limemobile.notes.data.local.NotesDatabase_Impl.clearAllTables + 280(NotesDatabase_Impl.java:280)

1 Ответ

0 голосов
/ 05 октября 2019

Вам необходимо выполнить одно из трех действий: -

  1. Указать необходимые пути миграции, что влечет за собой добавление подходящих процедур миграции, или: -

  2. Переопределить метод onDestructiveMigration , используя метод RoomDatabase.Callback , вызванный с помощью .addCallback (the_CallBack_method) или: -

  3. Измените версию обратно на 1 вместе с удалением базы данных (удаление приложения или удаление данных приложения приведет к удалению базы данных). Тогда это не обнаружит изменение версии и, следовательно, не будет ожидать ни варианта 1, ни 2.

Какой вариант будет зависеть от непредоставленной информации, вы можете прочитать Понимание миграции с помощьюКомната .

Дополнительно

Ниже приведен пример, где метод onDestructiveMigration переопределяется, чтобы ничего не делать (таблицы базы данных эффективно очищаются от любых данных, но будут существовать).

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAppDB = Room.databaseBuilder(
            this,
            AppDatabase.class,
            "the_database"
    )
            .allowMainThreadQueries()
            .fallbackToDestructiveMigration()
            .addCallback(dbCallback) //<<<<<<<<<<< defines the callback to be called
            .build();
    }
}

//<<<<<<<<<< The callback
private RoomDatabase.Callback dbCallback = new RoomDatabase.Callback() {

    @Override
    public void onCreate(@NonNull SupportSQLiteDatabase db) {
        super.onCreate(db);
        //.......... code here to do anything required when the database is created ..........//
    }

    @Override
    public void onOpen(@NonNull SupportSQLiteDatabase db) {
        super.onOpen(db);
        //.......... code here to do anything required when the database is opened ..........//
    }

    @Override
    public void onDestructiveMigration(@NonNull SupportSQLiteDatabase db) {
        super.onDestructiveMigration(db);
        //.......... code here to do anything required when the database has effectively been recreated (tables would have been built) ..........//
    }
};
  • Переопределение onCreate и onOpen не требуется. Однако, если нет применимых миграций И ​​база данных была построена с .fallbackToDestructiveMigration () , то метод onDestructiveMigration должен быть переопределен (даже если ничего не делать, что может быть подходящим)в некоторых ситуациях) как это будет называться. т.е. именно поэтому он разбился
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...