RealmMigration стерла все данные в моем мире

Сегодня я изменил схему области приложения и реализовал Migration. Внутри миграции мне просто нужно было добавить поле, поэтому я сделал:

 if (oldVersion == 0) {
    RealmObjectSchema class = schema.get("Class");
    class.addField("addedField", boolean.class, null)
       .transform(new RealmObjectSchema.Function() {
           @Override
           public void apply(DynamicRealmObject obj) {
              obj.set("addedField", false);
           }
       });
       oldVersion++;
}

Но это стерло все в моем мире, у меня больше нет данных.

Это не проблема, так как я все еще на стадии разработки. Я выполнил миграцию вместо удаления/переустановки приложения, просто чтобы узнать, как реализовать RealmMigration.

Я сделал что-то неправильно? Это нормально, что у меня все стерлось? Мне нужно было добавить еще немного кода? Я уже прочитал документацию и взглянул на пример приложения. Предоставленный код больше ничего не дал.

Конфигурация области:

Realm.init(this);
RealmConfiguration newConfig = new RealmConfiguration.Builder()
   .name("myRealm.realm")
   .schemaVersion(1)
   .migration(new SchemaMigration())
   .build();

И по крайней мере:

Realm realm = Realm.getInstance(newConfig);

РЕДАКТИРОВАТЬ:

Я решил эту проблему, удалив файл name("myRealm.realm"). При первой установке я не использовал RealmConfiguration, поэтому имя области было: "default.realm". Спасибо, ребята, за вашу поддержку и ваши ответы!


person Luca Nicoletti    schedule 10.05.2017    source источник
comment
Вероятно, у вас установлен параметр deleteIfMigrationNeeded() в RealmConfiguration.Builder, который проверяется перед попыткой миграции.   -  person EpicPandaForce    schedule 10.05.2017
comment
Нет, не знаю. Я также обновлю ответ кодом конфигурации.   -  person Luca Nicoletti    schedule 10.05.2017


Ответы (1)


Попробуйте не передавать null в качестве атрибутов поля и используйте сеттер определенного типа (setBoolean) для преобразования DynamicRealmObject:

if (oldVersion == 0) {
    RealmObjectSchema class = schema.get("Class");
    class.addField("addedField", boolean.class)
         .transform(new RealmObjectSchema.Function() {
             @Override
             public void apply(DynamicRealmObject obj) {
             obj.setBoolean("addedField", false);
         }
    });
    oldVersion++;
}
person XIII-th    schedule 11.05.2017
comment
Это помогло, но я думаю, что проблема была связана с именем. При первой установке я не использовал RealmConfiguration. Итак, название царства было default.realm. Я удалил строку .name("myRealm.realm"), и это сработало, сохранилось все старое пространство. Я поддержу этот ответ, так как считаю, что удаление нулей в качестве атрибутов - это хороший момент, плюс setBoolean() лучше, чем set(). Спасибо, парень! - person Luca Nicoletti; 11.05.2017