2017-01-25 38 views
0

Контекст: isolateLocation and Subsceptibilities (1-many) имеют отношения от одного до многих, а также наркотики и восприимчивости (1-много). Все объекты RealmObjects и IsolateLocation, а также Drug содержат RealmList of susceptibilities. Восприимчивость создается для всех лекарств в каждом изоляторе. Затем эта восприимчивость добавляется в соответствующий список уязвимости IsolateLocation и список восприимчивости к лекарственным средствам.Строка автоматически удаляется в android RealmDB после добавления новой записи в связанной таблице?

Проблема: Первый объект Восприимчивость правильно добавлен в списки в обеих моделях (Drug & IsolateLocation), но следующий Восприимчивость, который создается корректно добавляется к модели Drug, сразу после добавления его в список Drug Susceptibility , предыдущая запись в списке уязвимости IsolateLocation удаляется. Так, в конце Drug Восприимчивость правильно с несколькими восприимчивостей, но 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(); 
} 
+0

Вы должны добавить элементы в 1 транзакцию, а не N транзакций на элемент N – EpicPandaForce

ответ

0

я понял, решение, прежде чем ответы выше, были размещены, не уверен, что если его правильный способ сделать это.

Я не сохранял никаких данных до тех пор, пока я не разобрал все данные в памяти 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 потому, что некоторые лекарственные препараты были сохранены в области после выполнения первой линии, которая в результате отношений между но вторая строка содержит все полные данные о лекарствах, поэтому, если запись уже существует, обновите ее.

+0

Я удалил первичный ключ из 'восприимчивости' – Zee

0

Вам нужно вставить realm managedSusceptibility экземпляры до 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(); 
} 

Подробнее информация о управление создание объекта вы можете прочитать official documentation и this answer.

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(); 

 Смежные вопросы

  • Нет связанных вопросов^_^