#android #android-room #data-integrity
#Android #android-room #целостность данных
Вопрос:
Я добавил несколько новых объектов (таблиц) в существующую базу данных. Так настроено в конфигурации базы данных-
@Database(entities = {existingTable1.class, existingTable2.class, existingTable3.class, existingTable4.class,
newTable1.class, newTable2.class
}, version = 1, exportSchema = false)
Поскольку приложение находится на стадии разработки, я использовал, чтобы избежать миграции. Итак, я отключил приложение с устройства и установил через Android Studio (запустить). Но он выдает следующую ошибку-
Room не может проверить целостность данных. Похоже, вы изменили схему, но забыли обновить номер версии. Вы можете просто исправить это, увеличив номер версии.
В моем манифесте allowBackup установлено значение false, как показано ниже-
android:allowBackup="false"
ОТРЕДАКТИРОВАНО
Я должен упомянуть одну вещь. У меня есть файл базы данных sqlite в папке активов. Я просто копирую его в соответствующую папку app DB при установке. Поэтому, когда необходимо добавить новую таблицу с большим количеством предварительно заполненных данных, я просто обновляю этот файл базы данных sqlite в папке активов, затем настраиваю соответствующие объекты и создаю / запускаю проект. Таким образом, он работал нормально, но на этот раз он создает эту проблему.
Комментарии:
1. Вы запускали хотя бы один раз после настройки
android:allowBackup="false"
?2. обязательно очистите данные и кэш
3. @ManoharReddy, да. Но после установки с устройства, почему требуется эта миграция: O
4. @Sadat откройте настройки приложения, очистите данные вручную и проверьте один раз.
5. @ManoharReddy, какие «настройки приложения»? не могли бы вы указать?
Ответ №1:
Если вы предварительно упаковываете свою базу данных в свой APK. Затем удалите из него ‘room_master_table’. Вы можете использовать SQLborwser для этого.
Ответ №2:
Если вам не нужны данные для сохранения и они вас не волнуют, просто сообщите Room, что вы переносите, вы можете использовать .fallbackToDestructiveMigration()
вот так.
database = Room.databaseBuilder(context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.fallbackToDestructiveMigration()
.build();
Он выполнит «удаление» за вас.
Вы можете обратиться к этой статье здесь
Комментарии:
1. Я сделал это, и я все еще получаю сообщение об ошибке, что происходит
2. увеличить версию room. и используйте debug, чтобы показать нам трассировку стека, пожалуйста
3. Я использовал ресурс interger в файле под названием integers.xml как
R.integer.databaseVersion
это была проблема. Теперь, когда я пишу interger напрямую, он работает.
Ответ №3:
При изменении структуры базы данных Room вам следует создать способ обновления существующей базы данных. Если первая структура была версией 1, вторая должна быть версией 2. Но Room нужен способ обновить существующую базу данных до новой структуры. Вы должны создать функцию миграции.
static RoomDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (RoomDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
RoomDatabase.class, "your_database")
.addMigrations(MIGRATION_1_2)
.build();
}
}
}
return INSTANCE;
}
private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE IF NOT EXISTS new_table...
}
};
если вы хотите начать с самого начала без обновления текущей базы данных, вы можете удалить ее, чтобы принудительно создать базу данных.
static RoomDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (RoomDatabase.class) {
if (INSTANCE == null) {
// do not forget to remove this line if it is not needed
context.getApplicationContext().deleteDatabase("your_database");
// Create database here
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
RoomDatabase.class, "your_database")...
...
Комментарии:
1. Я попробовал ваше второе решение, но оно просто делает записи в БД пустыми. Я отредактировал свой вопрос, пожалуйста, посмотрите.
2. Итак, когда вы заменяете свою базу данных на ту, которая находится в папке активов, проблема сохраняется?