【问题标题】:RealmMigration erased every data in my realmRealmMigration 删除了我领域中的所有数据
【发布时间】:2017-05-10 16:11:51
【问题描述】:

今天我更改了我的应用程序领域架构,因此我实施了迁移。 在迁移中,我只需要添加一个字段,所以我这样做了:

 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”。谢谢大家的支持和回答!

【问题讨论】:

  • 您可能在 RealmConfiguration.Builder 上设置了deleteIfMigrationNeeded(),在尝试迁移之前会对其进行检查。
  • 不,我没有。我也会用配置代码更新答案

标签: java android realm realm-migration


【解决方案1】:

尽量不要将null 作为字段属性传递,并使用特定于类型的setter (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++;
}

【讨论】:

  • 这有帮助,但我认为问题与名称有关。在第一次安装时,我没有使用 RealmConfiguration。所以领域的名称是default.realm。我删除了.name("myRealm.realm") 行,它起作用了,它保留了整个旧领域。我会赞成这个答案,因为我认为删除 null 作为属性是一个好点,加上setBoolean()set() 更好。谢谢你!
猜你喜欢
  • 2017-09-24
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多