插入现有记录时 Android 领域 copyToRealmOrUpdate 出错
Error on Android Realm copyToRealmOrUpdate when inserting existing records
我已经开始使用 Realm Android。到目前为止我很喜欢它,但我在尝试理解如何正确使用 "copyToRealmOrUpdate".
时遇到了一些问题
每次打开应用程序时,我都会收到一个带有 X "contacts" 的 JSON(我正在映射到一个 Contact RealmObject 数组),我想将它们插入 Realm数据库(如果不存在)或更新它们(如果存在)。
这里的问题是我每次这样做都会遇到主键错误,所以它似乎总是插入这些记录:“主键约束已损坏。值已存在:row_id1"
RealmObject 声明了一个@PrimaryKey "Id"。在此测试场景中,我尝试两次添加相同的 5 条记录。
这是我的插入代码:
mRealm.beginTransaction();
Contact contact;
for (int i = 0; i < contactArrayList.size(); i++) {
contact = mRealm.createObject(Contact.class);
contact.setId(contactArrayList.get(i).getId());
contact.setFirstName(contactArrayList.get(i).getFirstName());
...
mRealm.copyToRealmOrUpdate(contact);
}
mRealm.commitTransaction();
非常感谢任何帮助,谢谢!
这是因为您将 mRealm.createObject()
与 mRealm.copyToRealmOrUpdate()
组合在一起。这两个概念实际上是正交的。
Realm 以 "managed" 和 "standalone objects" 的概念运作。独立对象是使用普通 new
运算符创建并在您使用 mRealm.copyXXX
方法之一时转换为托管对象的对象。
另一方面,mRealm.createObject()
立即创建托管对象并将所有字段设置为默认值。对于 类 和 @PrimaryKey
这可能是个问题,因为设置主键的默认值(0 或“”)可能会与已经存在的主键冲突,然后您将收到错误消息见。
在您的情况下,执行以下操作应该有效:
mRealm.beginTransaction();
Contact contact;
for (int i = 0; i < contactArrayList.size(); i++) {
contact = new Contact();
contact.setId(contactArrayList.get(i).getId());
contact.setFirstName(contactArrayList.get(i).getFirstName());
...
mRealm.copyToRealmOrUpdate(contact);
}
mRealm.commitTransaction();
我已经开始使用 Realm Android。到目前为止我很喜欢它,但我在尝试理解如何正确使用 "copyToRealmOrUpdate".
时遇到了一些问题每次打开应用程序时,我都会收到一个带有 X "contacts" 的 JSON(我正在映射到一个 Contact RealmObject 数组),我想将它们插入 Realm数据库(如果不存在)或更新它们(如果存在)。
这里的问题是我每次这样做都会遇到主键错误,所以它似乎总是插入这些记录:“主键约束已损坏。值已存在:row_id1"
RealmObject 声明了一个@PrimaryKey "Id"。在此测试场景中,我尝试两次添加相同的 5 条记录。
这是我的插入代码:
mRealm.beginTransaction();
Contact contact;
for (int i = 0; i < contactArrayList.size(); i++) {
contact = mRealm.createObject(Contact.class);
contact.setId(contactArrayList.get(i).getId());
contact.setFirstName(contactArrayList.get(i).getFirstName());
...
mRealm.copyToRealmOrUpdate(contact);
}
mRealm.commitTransaction();
非常感谢任何帮助,谢谢!
这是因为您将 mRealm.createObject()
与 mRealm.copyToRealmOrUpdate()
组合在一起。这两个概念实际上是正交的。
Realm 以 "managed" 和 "standalone objects" 的概念运作。独立对象是使用普通 new
运算符创建并在您使用 mRealm.copyXXX
方法之一时转换为托管对象的对象。
mRealm.createObject()
立即创建托管对象并将所有字段设置为默认值。对于 类 和 @PrimaryKey
这可能是个问题,因为设置主键的默认值(0 或“”)可能会与已经存在的主键冲突,然后您将收到错误消息见。
在您的情况下,执行以下操作应该有效:
mRealm.beginTransaction();
Contact contact;
for (int i = 0; i < contactArrayList.size(); i++) {
contact = new Contact();
contact.setId(contactArrayList.get(i).getId());
contact.setFirstName(contactArrayList.get(i).getFirstName());
...
mRealm.copyToRealmOrUpdate(contact);
}
mRealm.commitTransaction();