我正在尝试更新RelamObject(在这种情况下为RealmCase)内部的属性。我尝试了下面的代码,尽管我在RealmPatientInfo表中确实看到了一个新对象,但似乎没有任何更新,但RealmCase却没有创建任何关系。
RealmCase realmCase = new RealmCase();
realmCase.setId(getId());
realmCase.setPatientInfo(new RealmPatientInfo(patientInfo));
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
realm.copyToRealmOrUpdate(realmCase);
realm.commitTransaction();
realm.close();
我也尝试了以下方法,但出现异常,该值不是由领域管理的。
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
RealmQuery<RealmCase> query = realm.where(RealmCase.class);
RealmCase persistedCase = query.findFirst();
persistedCase.setPatientInfo(new RealmPatientInfo(patientInfo));
realm.copyToRealmOrUpdate(realmCase);
realm.commitTransaction();
realm.close();
我也想删除旧的PatientInfo对象(引用和RealmPatientInfo表中的条目),下面是我的尝试,尽管以前的错误使我无法测试该部分。
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
RealmQuery<RealmCase> query = realm.where(RealmCase.class);
RealmCase persistedCase = query.findFirst();
if(persistedCase.getPatientInfo() != null) {
persistedCase.getPatientInfo().removeFromRealm();
persistedCase.setPatientInfo(null);
}
persistedCase.setPatientInfo(new RealmPatientInfo(patientInfo));
realm.copyToRealmOrUpdate(realmCase);
realm.commitTransaction();
realm.close();
任何意见是极大的赞赏。
最佳答案
如果要在确保正确删除旧对象的同时替换PatientInfo
中的RealmCase
对象,可以执行以下操作:
Realm realm = null;
try {
realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmQuery<RealmCase> query = realm.where(RealmCase.class);
RealmCase persistedCase = query.findFirst();
PatientInfo oldPatientInfo = persistedCase.getPatientInfo();
if(oldPatientInfo != null) {
oldPatientInfo.removeFromRealm();
}
// New Objects either have to be copied first or created using createObject
PatientInfo newPatientInfo = realm.copyToRealm(new RealmPatientInfo(patientInfo));
persistedCase.setPatientInfo(newPatientInfo);
}
});
} finally {
if(realm != null) {
realm.close();
}
}
现在,您必须手动删除旧的
PatientInfo
,而级联删除可以自动进行:https://github.com/realm/realm-java/issues/1104另外,例如RealmList支持在使用
list.add(item)
时自动将对象复制到Realm,设置setPatientInfo
之类的属性需要首先保留对象。这可能是我们应该重新考虑的事情,以便行为更加一致。这也意味着您的第一个代码示例将起作用。