2017-05-21 6 views
0

Ich frage mich nur, ob es eine Möglichkeit gibt, eine RealmList asynchron auf Android zu sortieren.RealmList Sortierung Async?

sagen, dass ich ein Reich bezwecken diaryEntry genannt, die ein RealmList von Entry Objekte enthält:

RealmList<Entry> entries; 
public RealmList<Entry> getEntries() { return entries; } 

Wenn ich die Realmlist ich rufen Sie einfach sortieren sortieren wollen und das ist es, es funktioniert gut.

RealmResults<Entry> sortedEntries = diaryEntry.getEntries().sort("time"); 
mvpView.bindAndShowEntryList(sortedEntries); 

Der obige Code jedoch in einem Fragment's onResumeFragment() Verfahren ausgeführt wird, das, wenn das Fragment sichtbar wird aufgerufen wird (es ist ein Verfahren zum kundenspezifischen Lebenszyklus I eingeführt wird) in einem ViewPager. Also wäre es natürlich schön, wenn ich die Daten im Hintergrund sortieren könnte und wenn das Fragment sichtbar wird, bilde einfach die Ergebnisse an die Ansicht.

So kam ich mit einer zweiten Lösung bis unter:

entries = realm.where(Entry.class) 
       .equalTo("dateId", dateId) 
       .findAllSortedAsync("time"); 

Hinweis: dateId eine ganze Zahl ist und eine eindeutige ID für jeden Fragment im ViewPager. Auf diese Weise musste ich der Entry.class ein neues indiziertes Integer-Feld dateId hinzufügen.

public class Entry extends RealmObject { 
    // Other fields ... 
    @Index 
    private int dateId; 

Meine Frage: Gibt es eine Möglichkeit, eine RealmList asynchron zu sortieren? Wenn nicht, welcher Ansatz könnte besser sein? Die erste, die Sorten die Einträge auf der UI Thread hat aber den sofortigen Zugriff auf eine RealmList alle entsprechenden Entry Objekte enthält (im Durchschnitt 10-15 Eintrag Objekte). Oder der zweite Ansatz, der alle entsprechenden Entry Objekte zuerst durch ihre dateId finden muss, aber macht das alles async ohne das UI-Thread zu blockieren?

Hinweis: Im Durchschnitt sind es ca. 10-15 Entry Objekte für jeden einzigartigen dateId, so dass, wenn ein normaler Benutzer meine Anwendung für 2 Jahre verwendet, und fügt etwa 15 Einträge täglich wird es etwa 11000 Entry Objekte werden in die Datenbank. Dies ist offensichtlich eine ziemlich hohe Annahme, da kein Benutzer jeden Tag Einträge hinzufügen wird und nicht einmal so viel.

+0

'.findAllSortedAsync (" Zeit ");' sortiert asynchron. Der 'RealmChangeListener', den Sie hinzufügen, wird aufgerufen, wenn die anfängliche Async-Auswertung abgeschlossen ist (und bei jeder zukünftigen Änderung). – EpicPandaForce

+0

Also wäre der zweite Ansatz besser, obwohl die Datenbank zuerst nach den Entry-Objekten abgefragt werden muss? Aber ich denke, die Suchgeschwindigkeit ist ziemlich schnell und es ist asynchron (die minimale Suchzeit ist nicht wirklich wichtig?), Also ist es der bessere Ansatz, habe ich das richtig verstanden? – Elias

+0

Ich weiß, es ist Off-Topic, aber gibt es eine Möglichkeit, die RecyclerView-Elemente mit einem RealmRecyclerViewAdapter zu animieren? – Elias

Antwort

1

Sie tun können:

RealmResults<Entry> sortedEntries = diaryEntry.getEntries() 
      .where() 
      .findAllSortedAsync("time"); 

Diese eine Abfrage auf Ihre Eingaben Liste basiert schaffen und die Abfrage im Hintergrund-Thread ausgeführt werden.

+0

Danke, ich habe es getestet und es funktioniert auch gut. Jetzt muss ich entscheiden, welcher Ansatz datenmodellgerechter ist. Speichern einer'RealmList' von Einträgen oder einer einfachen Integer-ID, um später die Einträge zu finden, die zusammengehören. Vielen Dank trotzdem, wirklich nette Unterstützung - Realm <3 – Elias

Verwandte Themen