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

时间:2015-05-14 07:28:52

标签: android realm

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

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

这里的问题是我每次都会收到主键错误,因此似乎总是插入这些记录:“主键约束已损坏。值已存在:row_id1 ”< / p>

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();

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:4)

这是因为您要将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();