2017-01-25 4 views
0

Kontext: isolateLocation und Suszeptibilitäten (1-viele) haben eine eins zu viele Beziehung sowie Droge und Empfindlichkeiten (1-viele). Alle sind RealmObjects und IsolateLocation sowie Drogen enthält RealmList der Suszeptibilitäten. Eine Empfindlichkeit wird für alle Arzneimittel in jedem Isolat erstellt. Diese Suszeptibilität wird dann zur entsprechenden IsolatLocation-Suszeptibilitätsliste und zur Liste der Arzneimittelanfälligkeit hinzugefügt.Zeile automatisch in Android RealmDB nach dem Hinzufügen neuer Eintrag in einer verwandten Tabelle gelöscht?

Problem: Das erste Susceptibility Objekt ist, sowohl die Modelle (Drug & IsolateLocation), aber die nächsten Susceptibility in korrekt Listen hinzugefügt, die korrekt auf das Medikament Modell hinzugefügt wird erzeugt, unmittelbar nachdem es an die Wirkstoffansprechverhaltens Liste hinzugefügt , der vorherige Eintrag in der IsolateLocation Suszeptibilitätsliste wird gelöscht. So am Ende ist Wirkstoffansprechverhaltens korrekt mit mehreren Suszeptibilitäten aber IsolateLocation Empfänglichkeit Liste hat nur 1.

Rohdaten: http://imgur.com/a/iTPY8

Code:

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

Sie sollten die Elemente in 1 Transaktion hinzufügen, nicht N Transaktionen pro N-Element – EpicPandaForce

Antwort

0

mir eine Lösung herausgefunden, bevor die Antworten oben gepostet wurden, nicht sicher, ob es der richtige Weg, es zu tun.

hat beharren ich keine Daten, bis ich alle Daten in List<IsolateLocation> isolateLocationList und List<Drug> drugList im Speicher analysiert, dann ohne Susceptibility ein Reich verwaltete Objekt zu schaffen. Hinzugefügt wurde die List<Susceptibility> susceptibilitiesList, um sowohl die drugList und isolateLocationList und diese Methode aufgerufen

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

Die zweite Zeile ist copyToRealmOrUpdate ist, weil einige Drogen in Reich nach der Ausführung der ersten Zeile gespeichert wurden, die zwischen dem als Ergebnis der Beziehung Modelle, aber die zweite Zeile hat alle vollständigen Daten über die Drogen so, wenn ein Eintrag bereits existiert, aktualisieren Sie es.

+0

Ich habe den Primärschlüssel aus 'Suszeptibilität' entfernt – Zee

0

Sie fügen müssen realm managedSusceptibility Instanzen zu drugEntry.getSusceptibilities() und isolateLocationEntry.getSusceptibilities(). Das heißt, müssen Sie nach der Methode neue Susceptibility Instanz erstellen 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(); 
} 

Oder Sie unmanaged Instanz Reich durch Aufruf einfügen müssen realm.copyToRealm() vor dem Einsetzen es drugEntry.getSusceptibilities() und 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(); 
} 

Mehr Info über verwaltet Objekt Erstellung können Sie lesen official documentation und this answer.

0

Das ist, weil Sie angeblich sind wie folgt einfügen

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