Android:在领域迁移中更改旧主键

Amo*_*shi 3 android realm

我可以在领域迁移脚本中使用新主键更改旧主键吗?

Epi*_*rce 6

对的,这是可能的.

        RealmObjectSchema objectSchema = schema.get("MyObject");
        objectSchema.addField("newId", long.class)
                .transform(new RealmObjectSchema.Function() {
                    @Override
                    public void apply(DynamicRealmObject obj) {
                        obj.setLong("newId", getNewId(obj));
                    }
                })
                .removeField("id")
                .renameField("newId", "id")
                .addPrimaryKey("id");
Run Code Online (Sandbox Code Playgroud)

但是,您无法直接创建该字段

objectSchema.addField("newId", long.class, FieldAttribute.PRIMARY_KEY)
Run Code Online (Sandbox Code Playgroud)

因为数据库中的值初始化为0,这意味着您将违反创建约束.因此,只有在设置值后才能添加主键约束.


在你的情况下,

RealmObjectSchema objectSchema = schema.get("MyObject");
objectSchema.addField("newId", long.class)
    .transform(new RealmObjectSchema.Function() {
        @Override
        public void apply(DynamicRealmObject obj) {
            obj.setLong("newId", getNewId(obj));
        }
    })
    .removePrimaryKey()
    .addPrimaryKey("newId");
Run Code Online (Sandbox Code Playgroud)