我不确定我是否理解他们之间的不同:
在我看来,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);
}
});
}
答案 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:复制到剪贴板。