gpt4 book ai didi

android - 插入现有记录时 Android Realm copyToRealmOrUpdate 出错

转载 作者:行者123 更新时间:2023-11-29 15:50:37 27 4
gpt4 key购买 nike

我已经开始使用 Realm for Android。到目前为止我很喜欢它,但我在尝试了解如何正确使用“copyToRealmOrUpdate”时遇到了一些问题。

每次打开应用程序时,我都会收到一个带有 X“联系人”的 JSON(我正在将其映射到一个 Contact RealmObject 数组),如果它们不存在,我想将它们插入到 Realm DB 中,或更新它们以防万一。

这里的问题是我每次这样做都会遇到主键错误,所以它似乎总是插入这些记录:“主键约束已损坏。值已存在: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 以“托管”和“独立对象”的概念运行。独立对象是使用普通 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();

关于android - 插入现有记录时 Android Realm copyToRealmOrUpdate 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30231734/

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