Android Room требует миграции после вставки данных другим приложением - PullRequest
0 голосов
/ 05 ноября 2018

Я занимаюсь разработкой приложения для Android со встроенной базой данных SQLite, работающей на Android Room. Я перемещаю приложение с настольной Java на Android, и мне нужно перенести данные в базу данных Android из старой базы данных, используемой в настольном приложении. Я столкнулся с проблемой в Room, когда попытался использовать измененную базу данных в своем приложении для Android.

Я попытался взять файл базы данных, созданный Room, и переместить данные из старой базы данных в эту с помощью небольшого Java-приложения, которое я написал для этой цели. Я просто опустошил соответствующие таблицы, прочитал данные из старой базы данных и вставил их в новую базу данных.

Когда я попытался переместить файл базы данных обратно в мой Android devide и использовать его с приложением Android, я получил это исключение:

Комната не может проверить целостность данных. Похоже, вы изменили схему, но забыли обновить номер версии. Вы можете просто исправить это, увеличив номер версии.

Если я изменю версию базы данных в моем коде базы данных Room, то Room будет нуждаться в куске кода для миграции, даже если структура базы данных не изменилась:

java.lang.IllegalStateException: миграция с 1 на 2 была обязательной, но не найдена. Укажите необходимый путь миграции с помощью RoomDatabase.Builder.addMigration (Migration ...) или разрешите деструктивные миграции с помощью одного из методов RoomDatabase.Builder.fallbackToDestructiveMigration *.

Я попытался очистить кэш данных приложения, очистить все его данные и даже удалить приложение, а затем переустановить его с измененным файлом базы данных. Не заставил проблему уйти. Я также попробовал все здесь Комната не может проверить целостность данных , включая установку android: allowBackup = "false" в моем манифесте и добавление fallbackToDestructiveMigration в мою базу данных. После попытки fallbackToDestructiveMigration все данные моей новой базы данных исчезли. Но затем я снова поместил измененный файл базы данных, и он заработал. Если честно, я не совсем уверен, какой шаг заставил его работать. Я думаю, что он увеличивал номер версии, запускал его с помощью fallbackToDestructiveMigration и затем снова перемещал новый файл базы данных, когда fallbackToDestructiveMigration стер данные из базы данных ...

Мой вопрос: Как Room может знать, что база данных была изменена, если не было никаких изменений в ее структуре, которые делали бы ее несовместимой с сущностями моего приложения? И как узнать, хотя я очистил данные приложения с устройства? И какие шаги я должен предпринять в следующий раз, которые не упомянуты выше? Я хотел бы просто включить код миграции, который ничего не делает. Но это выглядит глупо, я бы хотел, чтобы номер версии оставался равным 1, поскольку приложение находится в стадии разработки.

1 Ответ

0 голосов
/ 05 ноября 2018

Добавить пустую миграцию.

 private val MIGRATION_1_2 = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                // empty migration.
            }
        }



  if (sInstance == null) {
            if (!checkDataBase())
                copyDataBase(context)

            synchronized(AppDatabase::class) {
                sInstance = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, DATABASE_NAME)

                        .addMigrations(MIGRATION_1_2)
                        .build()
            }
        }
        return sInstance!!

Вы можете проверить это Руководство по миграции от Florina Muntenescu, чтобы узнать больше о миграции

...