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.
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