在 RealmMigration 中创建对象并将其添加到 RealmList
Create and add object to RealmList in RealmMigration
在我当前的应用程序中,我有一个 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
}
其中RealmLong
如下:
public class RealmLong extends RealmObject {
private long val;
//.. getters and setters
}
为了将所有旧 HolderObject
迁移到新对象,我使用了我的自定义 RealmMigration。如下:
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。
也不要忘记在转换后删除旧字段。
请注意,迁移已包含在事务中,您无需实例化领域对象并自行执行事务。
(Bonus question) Is this the correct and best approach to this migration problem?
想法好,执行力不行。见上文。
有关迁移的更多信息,请参阅 github 上的 this 示例,当然还有文档。
在我当前的应用程序中,我有一个 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
}
其中RealmLong
如下:
public class RealmLong extends RealmObject {
private long val;
//.. getters and setters
}
为了将所有旧 HolderObject
迁移到新对象,我使用了我的自定义 RealmMigration。如下:
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。
也不要忘记在转换后删除旧字段。
请注意,迁移已包含在事务中,您无需实例化领域对象并自行执行事务。
(Bonus question) Is this the correct and best approach to this migration problem?
想法好,执行力不行。见上文。
有关迁移的更多信息,请参阅 github 上的 this 示例,当然还有文档。