Как обращаться со старыми версиями базы данных номеров или как настроить резервное копирование для определенных версий

#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();