首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在相关表中添加新条目后,在android RealmDB中自动删除行?

在相关表中添加新条目后,在android RealmDB中自动删除行?
EN

Stack Overflow用户
提问于 2017-01-25 23:55:18
回答 2查看 90关注 0票数 0

上下文:、isolateLocation和敏感性(1-多)与药物和敏感性(1-多)有一对多的关系.均为RealmObjects、IsolateLocation及药敏RealmList。为每个isolateLocation中的所有药物创建一个敏感性,然后将此敏感性添加到相应的IsolateLocation敏感列表和药物敏感列表中。

问题:将第一个药敏对象正确地添加到两个模型(& IsolateLocation)中的列表中,但将创建的下一个药敏对象正确地添加到药物模型中,在将其添加到药物敏感列表后,立即删除IsolateLocation易感列表中的前一个条目。因此,最终药物敏感性是正确的,多重药敏,但IsolateLocation药敏表只有1。

原始数据: http://imgur.com/a/iTPY8

代码:

代码语言:javascript
复制
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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-26 13:58:26

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

直到我将所有数据解析到内存中的List<IsolateLocation> isolateLocationListList<Drug> drugList中,然后没有为Susceptibility创建一个领域托管对象,我才坚持任何数据。将List<Susceptibility> susceptibilitiesList添加到drugListisolateLocationList中,并调用此方法

代码语言:javascript
复制
private void addDataToRealm() {
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.copyToRealm(isolateLocationList);
            realm.copyToRealmOrUpdate(drugList);
        }
    });
}

第二行是copyToRealmOrUpdate,因为某些药物在执行第一行之后被保存到了领域,这是模型之间关系的结果,但是第二行拥有关于药物的所有完整数据,因此,如果条目已经存在,那么就更新它。

票数 0
EN

Stack Overflow用户

发布于 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()实例

代码语言:javascript
复制
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()中。

代码语言:javascript
复制
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();
}

有关托管对象创建的更多信息,您可以阅读正式文件这个答案

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41863860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档