2016-05-15 2 views
1

Ich versuche herauszufinden, was der beste Weg zum Öffnen/Schließen von Realm-Instanzen ist. Wir verwenden Realm an 3 Orten - App, Aktivitäten und Worker-Thread. Es ist jedoch ziemlich cool, von jedem Ort aus auf Daten von Realm zuzugreifen. Daher haben wir alle unsere Realm-Abfragen/-Schreibvorgänge in eine Datenschicht eingeschlossen. Ist es (aus Performancegründen) in Ordnung, für jede Abfrage folgendes zu tun (und bei jedem Schreiben ähnlich)?Ist es in Ordnung, Realm-Instanz nach jeder Abfrage/Schreiben zu schließen?

try (Realm realm = getRealm()) { 
    return realm.copyFromRealm(realm.where(Task.class).isNull("name") 
    .findAllSorted("createdAt", Sort.DESCENDING)); 
} 

Wie machen Sie etwas Ähnliches in der asynchronen Transaktion? Gibt es bessere Ansätze? (Wir verwenden RxJava).

Vielen Dank!

EDIT: Nach schnelle Antwort von @ christian-Melchior werden wir es wie folgt verwenden:

try (Realm realm = getRealm()) { 
    return realm.copyFromRealm(realm.where(Task.class).isNull("name") 
    .findAllSortedAsync("createdAt", Sort.DESCENDING)); 
} 

EDIT2: Wir tatsächlich auf diese angesiedelt:

Realm realm = getRealm(); 
return realm.where(Task.class).isNull("name") 
    .findAllSortedAsync("createdAt", Sort.DESCENDING) 
    .asObservable() 
    .filter(RealmResults::isLoaded) 
    .first() 
    .map(realmObjects -> { 
     if (realmObjects.isEmpty()) { 
      realm.close(); 
      return null; 
     } 
     List<Task> res = realm.copyFromRealm(realmObjects); 
     realm.close(); 
     return res; 
    }); 

Da wir wollen unser onComplete soll nach jeder Abfrage aufgerufen werden.

Antwort

1

Mit copyFromRealm erhalten Sie eine In-Memory-Kopie aller Daten, so lange wie Sie keine riesigen Listen laden, sollte es gut funktionieren. Sie werden jedoch mehr Speicher verwenden, und es gibt einen leichten Overhead beim Öffnen und Schließen von Realms die ganze Zeit.

Eine Idee, die Realm-Lebenszyklus für die Steuerung kann hier gesehen werden: https://realm.io/docs/java/latest/#controlling-the-lifecycle-of-realm-instances

beachten Sie auch in vielen Fällen unsere Asynchron-API verwenden können, wenn Sie auf dem UI-Thread besorgt über das Laden von Daten sind: https://realm.io/docs/java/latest/#asynchronous-queries

+0

Danke ! Wir werden die * Async-Methoden verwenden (vergessen Sie dies im Beispiel zu erwähnen). Warum macht Realm so harte Update-Objekte (Sie müssen in der Transaktion sein), das macht die Abstraktion von Realm-Implementierung ziemlich schwierig? Gibt es eine Chance, die Notwendigkeit von 'close()' komplett zu beseitigen? – curiousily

Verwandte Themen