当前位置: 首页 > 知识库问答 >
问题:

Android 领域复制到实时错误或插入现有记录时更新

雷方伟
2023-03-14

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

每次打开应用程序时,我都会收到一个带有X“contacts”的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();

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

共有1个答案

麻宜春
2023-03-14

这是因为您将< code > mrealm . createobject()与< code > mrealm . copytorealmorupdate()结合在一起。这两个概念实际上是正交的。

Realm 以“托管”和“独立对象”的概念运行。独立对象是使用常规的新运算符创建的对象,当您使用 mRealm.copyXXX 方法之一时,这些对象将转换为托管对象。

一方面,mRealm.create对象() 会立即创建托管对象,并将所有字段设置为默认值。对于具有@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定义了一个拥有收藏歌曲列表的用户: 我的应用程序模型基本上反映了服务器模型。因此,当我收到新的FavoriteSong时,我想将其保存到领域: 这失败了,因为FavoriteSong中包含的Song已经存在于域中,违反了主键约束。 一种解决方案是将收藏夹歌曲标签设置为主键: 然后使用CopToRealmOrUpdate()而不是CopToRealm(),它在插入之前检查所

  • 我有两个实体类,如下所示- 我在保存子记录时出错。 错误- Hibernate:插入子(名称,child\u id)值(?,)2022-07-19 23:12:31.727警告20940---[nio-8080-exec-2]o.h.engine.jdbc.spi。SqlExceptionHelper:SQL错误:0,SQLState:23502 2022-07-19 23:12:31.727错误

  • 我的php代码: 当我使用echo而不是mysql_query时,它返回: 它在我的phpmyadmin上运行得很好,但是当我将echo更改为mysql_query时,它只影响5行(两个表) P1_1-K1 P1_1-K4 P1_1-K3 P1_1-K2 P12-K1 我的完整数据库 --版本4.3.11 --主机:127.0.0.1--生成时间:2015年7月23日下午12:16--服务器版本:

  • 我目前使用JOOQ的可更新记录如下模式插入: 在,我希望使用数据库中的值更新,例如,如果表具有自动递增的列,将返回其值。 如果列具有唯一约束,则当违反该约束时,将抛出。我的问题是可以告诉JOOQ不要抛出异常,但仍然用现有的值更新记录吗?

  • 异常:到http://access.xyz.com的连接在org.apache.http.impl.conn.DefaultClientConnectionOperator.OpenConnection(DefaultClientConnectionOperator.java:190)在org.apache.http.impl.conn.ManagedClientConnectionImpl.Op