#android #kotlin #android-room #database-migration #fallback
#Android #kotlin #android-room #база данных-миграция #запасной вариант
Вопрос:
Как мы можем управлять старыми версиями базы данных.
Например, version = 1 version = 2 обе мои старые версии, текущая версия = 10. В версии 9,10 слишком много изменений.
в этом случае я хочу очистить базу данных для версии 1,2, если они обновятся до версии = 9 или 10
или
как мы можем написать запасной вариант для определенных версий?
Ответ №1:
Для управления резервным вариантом для определенных версий или для всех версий Room есть некоторый метод, с помощью которого мы можем управлять резервным вариантом.
1- fallbackToDestructiveMigrationFrom(int versions …)
-
разрешено деструктивно воссоздавать таблицы базы данных из определенных
-
запуск версий схемы.
-
Эта функциональность такая же, как и у
-
{@link #fallbackToDestructiveMigration()}, за исключением того, что этот метод позволяет
-
спецификация набора версий схемы, для которых разрешено разрушительное воссоздание.
-
Использование этого метода предпочтительнее, чем {@link #fallbackToDestructiveMigration()}, если вы хотите
-
разрешить деструктивные миграции из некоторых версий схемы, сохраняя при этом преимущества
-
исключения, возникающие из-за непреднамеренно пропущенных миграций.
-
Примечание: Никакие версии, переданные этому методу, также могут существовать как начальные или конечные
-
версии в {@link Migration}, предоставленные {@link #addMigrations(Миграция …)}. Если
-
версия, переданная этому методу, определяется как начальная или конечная версия при миграции,
-
будет выдано исключение.
instance = Room.databaseBuilder(context, DbHelper.class, "DatabaseName") .addMigrations(MIGRATION_4_5,MIGRATION_5_6) .fallbackToDestructiveMigrationFrom(1,2,3) .addCallback(new Callback() { @Override public void onCreate(@NonNull SupportSQLiteDatabase db) { super.onCreate(db); try { } catch (IOException e) { e.printStackTrace(); } } }).build();
2- fallbackToDestructiveMigration()
- Позволяет Room деструктивно воссоздавать таблицы базы данных, если {@link Migration} это
- перенос старых схем базы данных на последнюю версию схемы не найден.
- Когда версия базы данных на устройстве не соответствует последней версии схемы, Room
- запускает необходимые {@link Migration} ы в базе данных.
- Если не удается найти набор {@link Migration}, который приведет базу данных к
- текущая версия, она вызовет исключение {@link IllegalStateException}.
- Вы можете вызвать этот метод, чтобы изменить это поведение, чтобы воссоздать базу данных вместо сбоя.
- Если база данных была создана из ресурса или файла, Room попытается использовать то же самое
- файл для повторного создания базы данных, в противном случае это приведет к удалению всех данных в
- таблицы базы данных, управляемые Room.
instance = Room.databaseBuilder(context, DbHelper.class, "DatabaseName")
.fallbackToDestructiveMigration()
.addCallback(new Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
try {
} catch (IOException e) {
e.printStackTrace();
}
}
}).build();