0

上下文: isolateLocation 和 Susceptibilities (1-many) 以及 Drug and Susceptibilities (1-many) 具有一对多的关系。都是 RealmObjects 和 IsolateLocation 以及 Drug 包含 RealmList of Susceptibilities。为每个isolateLocation 中的所有药物创建一个Susceptibility,然后将此Susceptibility 添加到相应的IsolateLocation Susceptibility 列表和Drug Susceptibility 列表中。

问题:第一个 Susceptibility 对象已正确添加到两个模型(Drug & IsolateLocation)中的列表中,但创建的下一个 Susceptibility 对象在将其添加到 Drug Susceptibility 列表后立即正确添加到 Drug模型中,前一个条目在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();
}
4

3 回答 3

0

您需要将领域托管 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();
}

有关托管对象创建的更多信息,您可以阅读官方文档此答案

于 2017-01-26T03:57:37.250 回答
0

那是因为你应该像这样插入

realm.beginTransaction();
for (Drug drug : drugList){
    Susceptibility susceptibility = realm.createObject(Susceptibility.class, UUID.randomUUID().toString());
    Drug drugEntry = realm.where(Drug.class).equalTo("id", drug.getId()).findFirst();
    susceptibility.setDrug(drugEntry);
    susceptibility.setReference(parsedCsv[drug.getId()+1]);
    susceptibility.setSusceptibilityValue(parsedCsv[drug.getId()]);
    susceptibility.setIsolateLocation(isolateLocation);
    drugEntry.getSusceptibilities().add(susceptibility);
    IsolateLocation isolateLocationEntry = realm.where(IsolateLocation.class).equalTo("id", isolateLocation.getId()).findFirst();
    isolateLocationEntry.getSusceptibilities().add(susceptibility);
    //addSusceptibilityToRealm(isolateLocation, drug, susceptibility);
}
realm.commitTransaction();
于 2017-01-26T07:15:42.990 回答
0

在发布上述答案之前,我想出了一个解决方案,不确定它是否正确。

List<IsolateLocation> isolateLocationList在将所有数据解析到内存中之前,我没有保留任何数据List<Drug> drugList,然后没有为Susceptibility. List<Susceptibility> susceptibilitiesList在and 中添加了drugListisolateLocationList调用了这个方法

private void addDataToRealm() {
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.copyToRealm(isolateLocationList);
            realm.copyToRealmOrUpdate(drugList);
        }
    });
}

第二行是 copyToRealmOrUpdate 是因为在第一行执行后,由于模型之间的关系,一些药物被保存到领域,但第二行包含有关药物的所有完整数据,所以,如果一个条目已经存在更新它。

于 2017-01-26T13:58:26.497 回答