Это довольно сложный вопрос, но в основном у вас есть 2 стратегии:
fallbackToDestructiveMigration
-> прост в реализации, но ваши пользователи потеряют свои данные после обновления приложения
- Укажите стратегию
Migration
(предпочтительно)
Случай 1 - fallbackToDestructiveMigration
При инициализации вашей базы данных просто вызовите fallbackToDestructiveMigration
в своем построителе базы данных:
database = Room.databaseBuilder(context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.fallbackToDestructiveMigration()
.build();
В этом случае, так как вы обновили версию своей базы данных (предположительно с версии 1 до версии 2), Room не может найти какую-либо стратегию миграции, поэтому она вернется к разрушительной миграции, таблицы будут отброшены .
Случай 2 - Интеллектуальная миграция
Предположим, у вас есть таблица с именем «Пользователи» и вы добавили столбец в эту таблицу в версии 2 вашей базы данных. Давайте назовем этот столбец «user_score». Вы должны реализовать интерфейс migrate
класса Migration
, чтобы обновить схему «Users version 1» до «Users version 2». Для этого вам понадобится alter table
, вы можете написать его прямо внутри migrate
метода:
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
// Your migration strategy here
database.execSQL("ALTER TABLE Users ADD COLUMN user_score INTEGER")
}
};
database = Room.databaseBuilder(context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.addMigrations(MIGRATION_1_2)
.build();
Больше ссылок здесь: