【问题标题】:Realm Migration Duplicated values领域迁移重复值
【发布时间】:2016-03-22 05:34:34
【问题描述】:

我想做一个迁移(Realm 87.2)我以前做过其他人,但这并不容易,我不知道为什么

我以前的 Categoriy.class

private int code;
private String title;
private String category;
private int order;
private boolean visible;

新的 Category.class

@PrimaryKey @Index private String id;
    private int code;
    private String title;
    private String category;
    private int order;
    private boolean visible;

在 Migration.class 中

public class Migration....
int i = 0;
.....
  if(oldVersion == 7) {
            schema.get("Category").addField("id", String.class, FieldAttribute.PRIMARY_KEY).transform(new RealmObjectSchema.Function() {
                @Override
                public void apply(DynamicRealmObject obj) {
                    obj.set("id", UtilsForAll.getRandomUUID()); //Get Random UUID for previsoly added categories
                    obj.set("order", i);
                    i++;
                }
            });
oldVersion++;

}
} //finishClass

出于某种愚蠢的原因,我不知道我做错了什么,它一直给我这个错误:

java.lang.IllegalArgumentException:非法参数:字段“id” 不能是主键,它已经包含重复值:

什么?类别类中没有重复值,我很确定。

PS:这只是在我真正使用迁移并且之前有过类别记录时发生

--------------------- 22/03 编辑

按照 Emanuelez 的建议进行了尝试:

  if(oldVersion == 7) {
schema.get("Category").addField("id", String.class);
                schema.get("Category").transform(new RealmObjectSchema.Function() {
                    @Override
                    public void apply(DynamicRealmObject obj) {
                        obj.set("id", UtilsForAll.getRandomUUID()); //Get Random UUID for previsoly added categories

                    }
                });
    oldVersion++;

schema.get("Category").setPrimaryKey("id");
    }

错误变成了这个 -

io.realm.exceptions.RealmMigrationNeededException: 字段 'id' 确实 支持现有领域文件中的空值。删除 @Required 或 来自字段“id”的@PrimaryKey 或使用迁移 io.realm.internal.Table.convertColumnToNotNullable()。

ive tried.setNullable("id", true);`

也没有任何改变

【问题讨论】:

    标签: java database realm


    【解决方案1】:

    要添加新的主键字段,您不能只添加具有属性的字段,因为所有这些字段都将初始化为其默认值,全部相等,这会破坏主键合同。

    要以正确的方式执行此操作,您必须:

    1. 创建一个新字段
    2. 用新的不同值填充新字段
    3. 将新字段设为主键

    为了进一步参考,我建议你看一下 RealmObjectSchema 类的单元测试,可以找到here

    【讨论】:

    • 尝试了这 3 个步骤,没有任何改变,只是错误,我认为我做的事情和你指给我的测试完全一样 =(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    相关资源
    最近更新 更多