Realm android:无法将primarykey从0.82.2迁移到0.86.0,因为字段支持null



我在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);
            }
        }
    });

相关内容

最新更新