我在0.82.2安卓应用程序中有一个带有主键的表,其中包含以下字段:
// Each uid is generated using UUID strings:
@PrimaryKey
private String uid;
今天,我已经更新到Realm 0.86.0,以获得新的迁移api(因为我添加了另一个表,并希望迁移现有用户数据)。
然而,似乎0.82.2领域文件中的现有数据允许primarykey uid为null(当我在没有迁移uid字段的情况下运行应用程序时,领域)告诉我这一点
因此,我尝试创建一个名为"id"的新主键字段,然后使用以下代码迁移非null值:
dogSchema.removePrimaryKey();
dogSchema.addField("id", String.class, FieldAttribute.PRIMARY_KEY)
.transform(new RealmObjectSchema.Function() {
@Override
public void apply(DynamicRealmObject obj) {
String oldUid = obj.getString("uid");
// Bring over any non null uids, generate new id to replace nulls
if (oldUid == null || oldUid.equals("")) {
// Null, so generate one as primarykey doesnt allow nulls:
String newUid = RealmUtils.generateUID();
Log.d(TAG, "### New filler dog uid = " + newUid);
obj.setString("id", newUid);
} else {
Log.d(TAG, "### Old dog uid = " + oldUid);
obj.setString("id", oldUid);
}
}
});
dogSchema.removeField("uid");
然而,在迁移运行后,Realm抛出异常,声明:字段"id"不能是primaryKey,因为现有的领域文件已经包含重复的数据。尽管我可以看到每个ID值都是不同的。
如果我将id的addfield行更改为不带PrimaryKey属性(见下文),我会得到更多信息,但遇到另一个异常,说id不能是主键,可能是因为我的Model有@PrimaryKey注释。
dogSchema.addField("id", String.class)
如何将主键迁移到Realm 0.86.0?
感谢@Christian Melchior在Realm java github问题页面上的帮助(https://github.com/realm/realm-java/issues/1902),我设法将旧的模式primarykey迁移到领域0.86.0:
结束代码是(注意缺少"setNullable()"调用)
"如果您当前的uid字段可能包含null值,您应该可以这样做(不需要额外的字段):"
dogSchema.transform(new RealmObjectSchema.Function() {
@Override
public void apply(DynamicRealmObject obj) {
String oldUid = obj.getString("uid");
// Bring over any non null uids, generate new id to replace nulls
if (oldUid == null || oldUid.equals("")) {
// Null, so generate one as primarykey doesnt allow nulls:
String newUid = RealmUtils.generateUID();
Log.d(TAG, "### New filler dog uid = " + newUid);
obj.setString("uid", newUid);
} else {
Log.d(TAG, "### Old dog uid = " + oldUid);
obj.setString("uid", oldUid);
}
}
});