领域迁移重复值

时间:2016-03-22 05:34:35

标签: java database realm

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

我的previsoly 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:Illegal Argument:Field" 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:Field' id'不   支持现有Realm文件中的空值。删除@Required或   @PrimaryKey来自现场' id'或使用迁移   io.realm.internal.Table.convertColumnToNotNullable()。

i ve tried。setNullable(" id",true);`

也没有改变

1 个答案:

答案 0 :(得分:3)

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

要以正确的方式执行此操作:

  1. 创建新字段
  2. 使用新的不同值填充新字段
  3. 将新字段设为主键
  4. 为了进一步参考,我建议你看一下RealmObjectSchema类的单元测试,可以找到它here