Android 使用主键插入或更新域对象

Android 使用主键插入或更新域对象,android,realm,Android,Realm,我不确定我是否理解他们之间的不同: 在我看来,realm.createObject无法真正更新现有密钥,因为出现了错误:主键值已经存在 备选案文1: 备选案文2: 当您使用realm时,您需要在保存对象id之前以编程方式增加它。在下面的代码中,检查表中是否存储了任何值。如果没有值,只需将对象的id设置为1,作为nextId的默认值 int nextId = 1; if (realm.where(yourclass).max("id") != null){ nextId = realm.w

我不确定我是否理解他们之间的不同: 在我看来,realm.createObject无法真正更新现有密钥,因为出现了错误:主键值已经存在

备选案文1:

备选案文2:


当您使用realm时,您需要在保存对象id之前以编程方式增加它。在下面的代码中,检查表中是否存储了任何值。如果没有值,只需将对象的id设置为1,作为nextId的默认值

int nextId = 1;
if (realm.where(yourclass).max("id") != null){
    nextId = realm.where(yourclass).max("id").intValue() + 1;
}
yourclass.setId(nextId);

当您使用realm时,您需要在保存对象id之前以编程方式增加它。在下面的代码中,检查表中是否存储了任何值。如果没有值,只需将对象的id设置为1,作为nextId的默认值

int nextId = 1;
if (realm.where(yourclass).max("id") != null){
    nextId = realm.where(yourclass).max("id").intValue() + 1;
}
yourclass.setId(nextId);
我找到了我的答案:

最后,结果是一样的

选项1是更好的实践,因为当您使用:

realm.createObject(CacheFastObjTest.class, key);
领域是包装您的对象,并确保您使用正确的主键,否则开发人员将获得有关它的异常

另一方面,开发人员可以使用选项2

对于上述场景:

请注意,Realm.createObject将返回一个设置了所有字段的新对象 设置为其默认值。如果对象是具有主键的类, 这可能会造成冲突,可能有对象与此冲突 主键已设置。要避免这种情况,可以创建非托管 对象,设置其字段值,然后使用 复制或插入:复制到剪贴板

我找到了我的答案:

最后,结果是一样的

选项1是更好的实践,因为当您使用:

realm.createObject(CacheFastObjTest.class, key);
领域是包装您的对象,并确保您使用正确的主键,否则开发人员将获得有关它的异常

另一方面,开发人员可以使用选项2

对于上述场景:

请注意,Realm.createObject将返回一个设置了所有字段的新对象 设置为其默认值。如果对象是具有主键的类, 这可能会造成冲突,可能有对象与此冲突 主键已设置。要避免这种情况,可以创建非托管 对象,设置其字段值,然后使用 复制或插入:复制到剪贴板


是 啊但是realm.createObject和手动创建我的对象并更新它们之间有什么不同根据realm文档,copyToRealm将保留非托管对象,而createObject将直接创建托管对象,但我不是说copyToRealm。只是我的构造器的新CacheFastObjTest。是的。但是realm.createObject和手动创建我的对象并更新它们之间有什么不同根据realm文档,copyToRealm将保留非托管对象,而createObject将直接创建托管对象,但我不是说copyToRealm。只是用我的构造函数做了一个新的CacheFastObjTest。但这不是效率吗?!呃,很快。。一般来说,如果我有RealmList/RealmObject字段,我更喜欢这种方法。但是这样做不是很有效吗?不?!呃,很快。。通常,如果我有RealmList/RealmObject字段,我更喜欢这种方法。
realm.createObject(CacheFastObjTest.class, key);
CacheFastObjTest a = new CacheFastObjTest();
a.setKey(key);