上下文:、isolateLocation和敏感性(1-多)与药物和敏感性(1-多)有一对多的关系.均为RealmObjects、IsolateLocation及药敏RealmList。为每个isolateLocation中的所有药物创建一个敏感性,然后将此敏感性添加到相应的IsolateLocation敏感列表和药物敏感列表中。
问题:将第一个药敏对象正确地添加到两个模型(& IsolateLocation)中的列表中,但将创建的下一个药敏对象正确地添加到药物模型中,在将其添加到药物敏感列表后,立即删除IsolateLocation易感列表中的前一个条目。因此,最终药物敏感性是正确的,多重药敏,但IsolateLocation药敏表只有1。
原始数据: http://imgur.com/a/iTPY8
代码:
for (Drug drug : drugList){
Susceptibility susceptibility = new Susceptibility();
susceptibility.setId(UUID.randomUUID().toString());
susceptibility.setDrug(drug);
susceptibility.setReference(parsedCsv[drug.getId()+1]);
susceptibility.setSusceptibilityValue(parsedCsv[drug.getId()]);
susceptibility.setIsolateLocation(isolateLocation);
addSusceptibilityToRealm(isolateLocation, drug, susceptibility);
}
private void addSusceptibilityToRealm(IsolateLocation isolateLocation, Drug drug, Susceptibility susceptibility) {
realm.beginTransaction();
Drug drugEntry = realm.where(Drug.class).equalTo("id", drug.getId()).findFirst();
drugEntry.getSusceptibilities().add(susceptibility);
IsolateLocation isolateLocationEntry = realm.where(IsolateLocation.class).equalTo("id", isolateLocation.getId()).findFirst();
isolateLocationEntry.getSusceptibilities().add(susceptibility);
realm.commitTransaction();
}发布于 2017-01-26 13:58:26
在上面的答案发布之前,我想出了一个解决方案,不确定这是否是正确的方法。
直到我将所有数据解析到内存中的List<IsolateLocation> isolateLocationList和List<Drug> drugList中,然后没有为Susceptibility创建一个领域托管对象,我才坚持任何数据。将List<Susceptibility> susceptibilitiesList添加到drugList和isolateLocationList中,并调用此方法
private void addDataToRealm() {
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealm(isolateLocationList);
realm.copyToRealmOrUpdate(drugList);
}
});
}第二行是copyToRealmOrUpdate,因为某些药物在执行第一行之后被保存到了领域,这是模型之间关系的结果,但是第二行拥有关于药物的所有完整数据,因此,如果条目已经存在,那么就更新它。
发布于 2017-01-26 03:57:37
您需要将https://realm.io/docs/java/latest/#what-is-the-difference-between-a-normal-java-object-and-a-realm-object Susceptibility实例插入到drugEntry.getSusceptibilities()和isolateLocationEntry.getSusceptibilities()。也就是说,您需要通过方法Susceptibility创建新的realm.createObject()实例
for (Drug drug : drugList){
String id = UUID.randomUUID().toString();
realm.beginTransaction();
// Create a new object
Susceptibility susceptibility = realm.createObject(Susceptibility.class, id);
/*
setup properties of susceptibility instances
....
*/
addSusceptibilityToRealm(isolateLocation, drug, susceptibility);
realm.commitTransaction();
}或者,您需要通过调用realm.copyToRealm()将非托管实例插入到领域,然后将其插入到drugEntry.getSusceptibilities()和isolateLocationEntry.getSusceptibilities()中。
private void addSusceptibilityToRealm(IsolateLocation isolateLocation, Drug drug, Susceptibility susceptibility) {
realm.beginTransaction();
// Copy the object to Realm. Any further changes must happen on susceptibility
Susceptibility susceptibility = realm.copyToRealm(susceptibility);
Drug drugEntry = realm.where(Drug.class).equalTo("id", drug.getId()).findFirst();
drugEntry.getSusceptibilities().add(susceptibility);
IsolateLocation isolateLocationEntry = realm.where(IsolateLocation.class).equalTo("id", isolateLocation.getId()).findFirst();
isolateLocationEntry.getSusceptibilities().add(susceptibility);
realm.commitTransaction();
}https://stackoverflow.com/questions/41863860
复制相似问题