gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:09:39 25 4
gpt4 key购买 nike

在尝试初始化一个简单的 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:值已存在:0。然后我想哦,是的,该对象已创建。默认值为 id=0,只有在事后我才将值更改为其他值。它失败了,因为它已经有一个值为 0 的项目。所以我在类中设置 id=-1:

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

...但仍然得到相同的异常。

这是一个错误还是我在这里遗漏了一些东西?

更新

我删除了 @PrimaryKey 注释,并且类已正确填充。只是为了表明这些值是唯一的,这里是包含这些值的 Realm 类的镜头(实际值 - 这里没有刺客...):

enter image description here

最佳答案

来自 Realm 文档:

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

关于java - 使用 @PrimaryKey 0(零)初始化 Realm 对象在第二个对象上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36210839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com