2017-07-26 5 views
0

Ich habe eine Eins-zu-viele-Beziehung in RealmNur gültig verwaltete Objekte können von Realm kopiert werden

public class BayEntity extends RealmObject implements RealmModel { 

    @PrimaryKey 
    private int  id; 
    private String title; 
} 

public class TermEntity extends RealmObject implements RealmModel { 

    @PrimaryKey 
    private String termId; 
    private String name; 

    private RealmList<BayEntity> bayList; 

public void updateBayList(ArrayList<BayEntity> bayList) { 

     if(CollectionUtility.isEmptyOrNull(this.bayList)) 
      this.bayList = new RealmList(); 
     this.bayList.addAll(bayList); 
     realm.beginTransaction(); 
     realm.copyToRealm(this.bayList); 
     realm.insertOrUpdate(this); //update current instance 
     realm.commitTransaction(); 
    } 

    public ArrayList<BayEntity> getSimpleList() { 
     if(CollectionUtility.isEmptyOrNull(bayList)) 
      return new ArrayList<>(); 
     return (ArrayList<BayEntity>) realm.copyFromRealm(bayList); 
    } 
} 

Ich erhalte alle TermEntity Objekte enthält baylist als:

public RealmResults<TermEntity> getTerms() { 
     return realm.where(TermEntity.class).findAll(); 
    } 

ich in der Lage bin zu Speichern und Abrufen von bayList erfolgreich. Wenn ich versuche, es in Arraylist in Verfahren zur Umwandlung getSimpleList(), erhalte ich Ausnahme:

java.lang.IllegalArgumentException: Nur gültig verwaltete Objekte von Realm kopiert werden können.

Ich kann nicht verstehen, wie Objekte nicht verwaltet werden können, wenn sie aus dem Bereich gespeichert und abgerufen werden. Bitte korrigieren Sie mich. Vielen Dank.

Antwort

2

Es scheint mir, als ob Sie einige Probleme haben:

  1. Wo Sie die Realm Instanz erhalten, die Sie in der updateBayList Methode verwenden? Da es beispielsweise lokaler Zustand ist, kann es leicht zu einem Realm beziehen, die nicht gültig in dem aktuellen Kontext (Zeit oder Gewinde) ist

  2. Die ersten drei Zeilen RealmListTerm s if ... addAll(bayList); modifizieren. Sie können dies außerhalb einer Transaktion nicht tun, wenn das Objekt verwaltet wird. Wenn das Objekt nicht verwaltet wird, erhalten Sie den Fehler, den Sie beschreiben, da Sie verwaltete Objekte auf einem nicht verwalteten RealmList

  3. hinzuzufügen versuchen, zwar kein Problem, RealmObjectRealmModel bereits implementiert. Sag mal was, warum sagst du es nochmal?

Edited hinzufügen:

Um BayEntity s zu einem TermEntity, stellen Sie zunächst sicher hinzufügen, dass die TermEntity ist ein verwaltetes Objekt (verwenden copyToRealm oder Abfrage für sie). Sobald Sie das tun, ist der Code in updateBayList sehr korrekt. Sie möchten etwas wie:

realm.beginTransaction(); 
    if (CollectionUtility.isEmptyOrNull(this.bayList)) { 
     this.bayList = new RealmList(); 
    } 
    this.bayList.addAll(bayList); 
    realm.commitTransaction(); 
+0

Vielen Dank für Hinweise auf Fehler in meinem Code. Können Sie mir bitte sagen, wie BayList korrekt aktualisiert wird? Ich möchte Elemente zu einer bereits bestehenden Liste hinzufügen .. Danke – NightFury

+0

Darüber hinaus Realm ist eine Instanz aus einer Singleton-Klasse, separat verwaltet. Ich habe dies hier der Einfachheit halber erwähnt. – NightFury

Verwandte Themen