使用@PrimaryKey初始化Realm对象0(零)在第二个对象上失败

尝试初始化一个简单的Realm对象时,遇到一些奇怪的行为。 我有一个JSONArray,看起来像这样:

[{"id":0,"name":"Biatrix"},{"id":1,"name":"Bill"},{"id":2,"name":"O-ren"}] 

我有以下简单的Realm类:

 import io.realm.RealmObject; import io.realm.annotations.PrimaryKey; import io.realm.annotations.Required; public class Assassin extends RealmObject { @PrimaryKey private int id; @Required private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 

这里是我如何尝试填充类(在Kotlin):

 val assassins = viperData.getJSONArray("assassins") for (i in 0..(assassins.length() - 1)) { val item = assassins.getJSONObject(i) var assassin = realm.createObject(Assassin::class.java) assassin.setId(item.getInt("id")) assassin.setName(item.getString("name")) } 

第一个id = 0的项目创建的很好,但在第二个项目中我得到一个异常io.realm.exceptions.RealmPrimaryKeyConstraintException: Value already exists: 0 。 然后我想哦,对象是创建公关。 默认值为id = 0,只有后缀才会改变其他值。 它失败了,因为它已经有一个值为0的项目。所以我在类中设置id = -1:

 ... public class Assassin extends RealmObject { @PrimaryKey private int id = -1; ... 

…但仍然得到相同的例外。

这是一个错误还是我在这里错过了什么?

更新

我删除了@PrimaryKey注释,并正确填充类。 只是为了表明这些值是独一无二的,下面是包含值的领域类(实际值 – 这里没有刺客……)的一个镜头:

在这里输入图像描述

从领域文档:

当调用Realm.createObject()时,它将返回一个新的对象,其所有字段都被设置为默认值。 在这种情况下,主键字段为默认值的现有对象可能会发生冲突。 为了避免这种情况,建议创建一个独立的对象,设置字段的值,然后通过copyToRealm()方法将其复制到Realm。