Я пытаюсь перенести базу данных Room из версий 2 и 3 в 4 следующим образом:
private static final Migration MIGRATION_2_4 = new Migration(2, 4) {
@Override
public void migrate(@NonNull @NotNull SupportSQLiteDatabase database) {
database.execSQL(
"ALTER TABLE 'market_data' ADD COLUMN 'watch_list_boolean' TEXT NOT NULL DEFAULT '0'");
database.execSQL("DROP TABLE 'developer_data'");
}
};
но это не работает, что здесь не так?
При всем уважении, вы придерживаетесь консервативного подхода.
Поскольку база данных Room использует Gradle для установки номера версии, ее очень легко изменить.
Таким образом, вместо того, чтобы полагаться на инструменты Gradle и SQLiteDatabase, которые сделают эту работу за вас, используйте версию вашей базы данных в памяти и просто создайте столбец с помощью простого SQL.
Скорее всего, проблема (опубликуйте трассировку стека, чтобы помочь будущим читателям) заключается в том, что ваша БД не сможет выполнять миграции 2-> 3 и 3-> 4.
Таким образом, ваш код будет работать только в том случае, если ваша БД будет обновлена с 2 непосредственно до 4, и выдаст исключение (указывающее, какая миграция отсутствует), если БД будет обновлена с 2 до 3 или с 3 до 4.
Лучшей практикой является создание отдельных миграций — 2 в 3 и 3 в 4.
Room будет знать, что нужно выполнить правильные миграции и в правильном порядке (2->3 или 3->4 или 2->3->4):
private static final Migration MIGRATION_2_3 = new Migration(2, 3) {
@Override
public void migrate(@NonNull @NotNull SupportSQLiteDatabase database) {
database.execSQL(
"ALTER TABLE 'market_data' ADD COLUMN 'watch_list_boolean' TEXT NOT NULL DEFAULT '0'");
}
};
private static final Migration MIGRATION_3_4 = new Migration(3, 4) {
@Override
public void migrate(@NonNull @NotNull SupportSQLiteDatabase database) {
database.execSQL("DROP TABLE 'developer_data'");
}
};
Не забудьте обновить версию БД :)
Согласен, спасибо за отзыв
Это сработало, большое спасибо!
Пожалуйста :)
Возможно, отредактируйте свой ответ, чтобы объяснить, что Миграция (2,4) будет мигрировать только в том случае, если база данных (старая версия) имеет значение 2, а версия приложения (новая версия) — 4. Она не будет мигрировать с 3 на 4, что, вероятно, проблема, с которой сталкивается плакат.