Android 在RealmMigration中创建对象并将其添加到RealmList

Android 在RealmMigration中创建对象并将其添加到RealmList,android,realm,realm-migration,Android,Realm,Realm Migration,在我当前的应用程序中,我有一个HolderObject(它扩展了RealmObject)和一个long“machineId”。在新版本的应用程序中,这个HolderObject将能够以RealmList的形式包含更多的机器。请参见下面的课程: 旧对象: public class HolderObject extends RealmObject{ private long machineId; //.. getters and setters } 新对象: public clas

在我当前的应用程序中,我有一个
HolderObject
(它扩展了
RealmObject
)和一个
long
“machineId”。在新版本的应用程序中,这个
HolderObject
将能够以RealmList的形式包含更多的机器。请参见下面的课程:

旧对象:

public class HolderObject extends RealmObject{
    private long machineId;
    //.. getters and setters
}
新对象:

public class HolderObject extends RealmObject{
    private RealmList<RealmLong> machineIds;
    //.. getters and setters
}
要将所有旧的
HolderObject
s迁移到新对象,我使用我的自定义RealmMigration。详情如下:

public class RealmLong extends RealmObject {
    private long val;
    //.. getters and setters
}
public class CustomRealmMigration implements RealmMigration {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();

        schema.get("HolderObject")
                .addRealmListField("machineIds", schema.get("RealmLong"))
                .transform(new RealmObjectSchema.Function() {
                    @Override
                    public void apply(DynamicRealmObject obj) {
                        Realm realm = Realm.getDefaultInstance();
                        realm.beginTransaction();
                        RealmLong realmLong = realm.createObject(RealmLong.class);
                        realmLong.setVal(obj.getLong("machineId"));
                        obj.getList("machineIds").add(realmLong);
                        realm.commitTransaction();
                        realm.close();
                    }
                });
    }
}
问题:

  • 在行
    obj.getList(“machineIds”).add(realmLong)中,我得到一个错误,这个函数需要一个
    DynamicRealmObject
    ,而不是
    RealmLong
    。如何将
    RealmLong
    添加到此列表中
  • (附加问题)这是解决这个迁移问题的正确和最好的方法吗
    • 这样做:

      schema.get("HolderObject")
              .addRealmListField("machineIds", schema.get("RealmLong"))
              .transform(new RealmObjectSchema.Function() {
                  @Override
                  public void apply(DynamicRealmObject obj) {
                      DynamicRealmObject realmLong = realm.createObject("RealmLong");
                      realmLong.setLong("val", obj.getLong("machineId"));
                      obj.getList("machineIds").add(realmLong);
                  }
              })
              .removeField("machineId");
      
      您创建的realmLong对象必须是DynamicRealmObject。
      也不要忘记在转换后删除旧字段

      请注意,迁移已经包装在事务中,您不需要实例化领域对象并自己执行事务

      (附加问题)这是解决这个迁移问题的正确和最好的方法吗

      想法是好的,执行不是。见上文

      有关迁移的更多信息,请参阅github上的示例,当然还有文档