Я занимаюсь разработкой приложения для 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, поскольку приложение находится в стадии разработки.