Миграция области с новой схемой

У меня есть приложение, которое уже использовало базу данных области. Теперь я хочу добавить в схему новый RealmObject (скажем, я хочу добавить Person в качестве моего нового класса RealmObject). Из документации видно, что мне нужно сделать следующее, чтобы это сработало:

RealmConfiguration config = new RealmConfiguration.Builder()
.schemaVersion(1) // Must be bumped when the schema changes
.migration(new MyMigration()) // Migration to run instead of throwing an exception
.build()




// Example migration adding a new class
class MyMigration extends RealmMigration {

  @Override
  public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
       // DynamicRealm exposes an editable schema
       RealmSchema schema = realm.getSchema();

       // Migrate to version 1: Add a new class.
       // Example:
       // public Person extends RealmObject {
       //     private String name;
       //     private int age;
       //     // getters and setters left out for brevity
       // }
       if (oldVersion == 0) {
          schema.create("Person")
              .addField("name", String.class)
              .addField("age", int.class);
          oldVersion++;
       }
       etc.... 

Мой вопрос здесь: нам действительно нужно создать схему Person «вручную» (т.е. добавить поля с их типом) здесь? Или есть способ использовать Person RealmObject, поскольку мы уже определили, какие поля должны принадлежать новому классу?


person simen-andresen    schedule 16.08.2017    source источник
comment
Мой вопрос: действительно ли нам нужно создавать схему Person вручную (т. е. добавлять поля с их типом) здесь? да   -  person Tim    schedule 16.08.2017
comment
я думаю, это поможет вам: medium.com/@budioktaviyans/   -  person Yoni    schedule 16.08.2017


Ответы (1)


Мой вопрос здесь: нам действительно нужно создать схему Person «вручную» (т.е. добавить поля с их типом) здесь?

Да.

Или есть способ использовать Person RealmObject, поскольку мы уже определили, какие поля должны принадлежать новому классу?

Я говорил об этом с Кристианом Мельхиором здесь , но проблема с использованием существующих в настоящее время классов RealmModel для определения того, какие поля вам нужно добавить и какие поля вам нужны удалить это:

Если у вас была сложная миграция (включая операции renameField() и transform()), то нет никакой гарантии, что ваши операции, которые вы определили из V5 объекта в V6 объекта, по-прежнему можно выполнять, если вы основываете свою миграцию на моделях областей, которые вы иметь в схеме версию V8 позже.

По сути, это означает, что, учитывая, что RealmModels могут быть изменены, простое «обновление до последней модели» может даже привести к потере данных, вы будете ссылаться на несуществующие поля и так далее.

По сути, использование текущей версии ваших моделей Realm для определения операций по изменению схемы не является перспективным.

person EpicPandaForce    schedule 29.09.2017