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

时间:2017-10-01 12:58:12

标签: android realm

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

选项1:

    try (Realm realm = Realm.getDefaultInstance()) {
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(@NonNull Realm realm) {
                CacheFastObjTest a = realm.createObject(CacheFastObjTest.class, key);
                a.setDataType(className.getName());
                a.setExpireTimestamp(expires.getTime());
                a.setText1("dsaf");
                a.setText2("234234324");
                realm.insertOrUpdate(a);
            }
        });
    }

选项2:

    try (Realm realm = Realm.getDefaultInstance()) {
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(@NonNull Realm realm) {
                CacheFastObjTest a = new CacheFastObjTest();
                a.setKey(key);
                a.setDataType(className.getName());
                a.setExpireTimestamp(expires.getTime());
                a.setText1("dsaf");
                a.setText2("234234324");
                realm.insertOrUpdate(a);
            }
        });
    }

3 个答案:

答案 0 :(得分:1)

当您使用领域时,您需要以编程方式增加对象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 :(得分:1)

CacheFastObjTest a = realm.where(CacheFastObjTest.class).equalTo("id", key).findFirst();
if(a == null) {
     a = realm.createObject(CacheFastObjTest.class, key);
}
a.setDataType(className.getName());
a.setExpireTimestamp(expires.getTime());
a.setText1("dsaf");
a.setText2("234234324");
//realm.insertOrUpdate(a);

答案 2 :(得分:1)

我找到了答案:

最后,结果是一样的。

选项1 是更好的做法,因为当您使用时:

realm.createObject(CacheFastObjTest.class, key);

Realm包装你的对象,并确保你使用正确的主键,否则开发人员将获得有关它的例外。

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

CacheFastObjTest a = new CacheFastObjTest();
a.setKey(key);

对于上述场景:

  

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

More information about realm with Primary key