【问题标题】:Error on Android Realm copyToRealmOrUpdate when inserting existing records插入现有记录时,Android Realm copyToRealmOrUpdate 出错
【发布时间】:2015-05-14 07:28:52
【问题描述】:

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

每次打开应用程序时,我都会收到一个带有 X 个“联系人”的 JSON(我正在映射到一个联系人 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();

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: android realm


    【解决方案1】:

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

    【讨论】:

    • 看来mRealm.copyToRealmOrUpdate(contactArrayList.get(i)) 也在工作。酷!
    猜你喜欢
    • 2016-10-18
    • 2016-12-26
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 2021-03-31
    相关资源
    最近更新 更多