2016-07-26 7 views
1
public RealmList<CategoriesDto> getListOfCategories(String type){ 

    final RealmList<CategoriesDto> listOfCategories = new RealmList<>(); 

    final CategoriesDto categoriesDto = realm.where(CategoriesDto.class).equalTo("identifier", type).findFirst(); 

    if (categoriesDto != null) { 

     realm.beginTransaction(); 
      RealmResults<CategoriesDto> categories = realm.where(CategoriesDto.class).equalTo("parentId", categoriesDto.getCategoryId()).findAll(); 
      for (int i = 0; i < categories.size(); i++) { 
       listOfCategories.add(categories.get(i)); 
      } 
     // realm.commitTransaction(); 
    } 

    return listOfCategories; 
} 

Ich Abfrage Reich zweimal in einem Verfahren, und diesen Fehler habe ich versucht, realm.beginTransaction() und realm.commitTransaction() nach jeder Abfrage.java.lang.IllegalStateException: Verschachtelte Transaktionen sind nicht zulässig. Verwenden Sie commitTransaction() nach jeder begintransaction()

Eine weitere Sache: Diese Abfrage liest nur Daten aus Realm db.

Um Daten in einer Datenbank zu schreiben, verwenden wir im Allgemeinen Commit, um Daten persistieren.

Ich habe versucht realm.commitTransaction() auch, aber ich bekomme den gleichen Fehler.

+0

Ich weiß nichts über Realm. Ist es wirklich erforderlich, beginTransaction() vor der Leseabfrage aufzurufen? –

+0

Ja, wenn Sie nicht angerufen haben, stürzt die Anwendung ab und der Fehler ist "Sie müssen reaml.beginTransactio() aufrufen" – user3449611

+0

Haben Sie versucht, 'beginTransaction' und' commitTransaction' in for for loop hinzuzufügen? –

Antwort

1

Ich hatte das gleiche Problem beim Aktualisieren und Schleifen eines Arrays mit einigen RealmObjects.

habe ich dies vor dem Zustand mit den

if(realm.isInTransaction()){ 
    realm.commitTransaction(); 
} 

Hoffnung Transaktionen, das hilft.

+0

Vielen Dank für Ihre Hilfe Ich habe meine Realm-Abfrage-Zeilen in Sie gegeben Bedingung if (realm.isInTransaction()) { realm.beginTransaction(); RealmResults categories = realm.where (CategoriesDto.class).equalTo ("parentId", categoriesDto.getCategoryId()). findAll(); für (int i = 0; i user3449611

+0

Ihre Bedingungen müssen unter meiner Antwort sein. Der Fehler besagt, dass Sie eine offene Realmtransaktion haben. Meine Bedingung schließt diese ausstehende Transaktion. Und dann öffnest du einen neuen. –

+0

Das Problem war, ich habe versucht, die RealmList, die ich von Abfrage zu myAdapter, indem Sie die RealmObjects zu listOfCategories, aber der Bereich sagt, können Sie diese Referenz, wenn es in transacion und nach dem Schließen dieser Transaktion auch mit verwenden Ihr Zustand, ich bekam den gleichen Fehler. so müssen Sie "copyFromRealm" – user3449611

2

bekam schließlich die Antwort nach einer Menge

versuchen Als ich die Reich Objekte Zugabe wurde von einer for-Schleife Anwendung statt, dass ich ein Reich Methode verwendet copyFromRealm(), unten ist das Stück Code

dadurch denke ich, dass es keine Notwendigkeit gibt, Commit anzuwenden und Transaktionen zu beginnen, da wir nur Leseoperationen durchführen.

+0

Akzeptieren Sie Ihre eigene Antwort, so kann es anderen Benutzern helfen und hält die unbeantwortete Warteschlange klarer. –

1

Wenn bei Nachleuchtdauer Sie alle Kategorie DTOS haben:

public class CategoriesDto extends RealmObject { 
    @PrimaryKey 
    private String categoryId; 

    @Index 
    private String identifier; 

    @Index 
    private String parentId; 

    private CategoriesDto parent; 

    //getters, setters 
} 

Und dann haben Sie

realm.executeTransaction(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
     realm.insertOrUpdate(dtos); 
     RealmResults<CategoriesDto> children = realm.where(CategoriesDto.class) 
                .isNotNull("parentId") 
                .isNull("parent") 
                .findAll(); 
     for(CategoriesDto category : children) { 
      CategoriesDto parent = realm.where(CategoriesDto.class).equalTo("categoryId", category.getParentId()).findFirst(); 
      category.setParent(category); 
     } 
     realm.insertOrUpdate(children); 
    } 
}); 

Dann können Sie tun

public RealmResults<CategoriesDto> getListOfCategories(String type) { 
    return realm.where(CategoriesDto.class) 
       .equalTo("identifier", type) 
       .equalTo("parent.categoryId", categoriesDto.getCategoryId()) 
       .findAll(); 
} 

Aber in Ihrem Fall, Sie Öffnen Sie einfach keine Transaktion und verwenden Sie copyFromRealm(). In diesem Fall bin ich nicht sicher, warum Sie eine RealmList<T> verwenden, obwohl.