2015-01-30 8 views
7

In einer Tabelle von sagen wir 100 Elemente, die der beste Ansatz ist, um die letzten 20 Objekte zu erhalten.Realm.io Android besten Ansatz, um die letzten 20 Artikel aus einer Tabelle zu bekommen

Eine Möglichkeit, die ich mir vorstellen kann, besteht darin, alle Objekte zu laden, das Array umzukehren, ein neues Array zu erstellen und aus den Ergebnissen 20 mal das neue Array zu füllen und es zurückzugeben.

So etwas wie folgt:

public ArrayList<DataObject> getLastItems (int qty){ 

    RealmResults<DataObject>results = realm.where(DataObject.class).findAll(); 

    Collections.reverse(results); 

    ArrayList<DataObject>arrayList = new ArrayList<>(); 

    for (int i = 0; i == qty; i++){ 

     arrayList.add(results.get(i)); 

    } 

    return arrayList; 
} 

Gibt es einen besseren Weg, dies schneller in Android mit realm.io zu tun?

aktualisieren

dies so weit ist, wie diese behandelt wird ..

public ArrayList<DataObject> getLastItems (int qty){ 

    RealmResults<DataObject>results = realm.where(DataObject.class).findAll(); 
    ArrayList<DataObject> arrayList = new ArrayList<>(); 
    for (int i = results.size(); i > Math.max(results.size() - 20, 0) ; i--) { 
     arrayList.add(results.get(i-1)); 
    } 

    return arrayList; 
} 

Antwort

0

sollten Sie versuchen, Objekte zu kopieren zu vermeiden, es sei denn, unbedingt erforderlich. Sobald Sie eine findAll() getan haben, haben Sie bereits eine geordnete Liste. Sie könnten dann einfach max (results.size() - 20, 0) verwenden, um zu wissen, von welchem ​​Index die Iteration gestartet werden soll, anstatt zu kopieren.

+0

können Sie weiter ausarbeiten Sie bitte oder ein Beispiel nennen? Das Maximum in Realm fragt nach einer Zeichenkette und gibt eine Zahl –

+0

Math.max sollte es tun. Mein Hauptpunkt ist es, das Kopieren vollständig zu vermeiden und nur auf die Objekte im Realm direkt mit einem relativen Index Bezug zu nehmen. Es hängt ganz von Ihren Bedürfnissen ab und wie Sie die Methode natürlich anwenden. Ich schlage im Grunde vor, diese Methode nicht zu haben, wenn Sie sie vermeiden können. – bmunk

+0

Danke für Ihre Eingabe..Ich muss die letzten X Einträge in eine Tabelle eingeben, ich kann nicht sortieren, da der Primärschlüssel von 3 Dateien geteilt wird .... Ich benutze die Max jetzt..aber immer noch von der letzten des Arrays auf eine bestimmte Anzahl von Nummer .. Ich wollte loswerden ein Array erstellen und ein Iterieren, nachdem alle Objekt mit der Abfrage erhalten –

2

RealmResults erstellt nur die Objekte, die Sie tatsächlich verwenden. Wenn Sie also alle über die Listen bewegen, um die Liste umzukehren, ist die Leistung sehr schlecht. Anstatt wie beschrieben, sollten Sie nur den richtigen Index finden und von dort starten, wie unten. Beachten Sie, dass Realms ungeordnet sind, sodass die zurückgegebenen Elemente nicht eindeutig definiert sind.

public ArrayList<DataObject> getLastItems (int qty){ 
    RealmResults<DataObject>results = realm.where(DataObject.class).findAll().sort("fieldName"); 
    ArrayList<DataObject> arrayList = new ArrayList<>(); 
    for (int i = Math.max(result.size() - 20, 0); i < results.size() ; i++) { 
     arrayList.add(results.get(i)); 
    } 

    return arrayList; 
} 
+0

dies beinhaltet immer noch ein Array erstellen und wiederhole die RealmErgebnisse ... Ich habe etwas von Ihrem Code und ich werde ein update..thanks –

7

Beachten Sie auch, dass Realm-Tabellen ungeordnet sind. Stellen Sie sich eine Tasche vor, in die Sie Ihre Daten eingeben. Wenn Sie die letzten 20 Elemente einfügen möchten, müssen Sie ein Feld hinzufügen, das die Einfügezeit enthält. Dadurch können Sie auch das gewünschte Ergebnis sehr effizient erreichen:

RealmResults<DataObject>results = 
    realm.where(DataObject.class) 
     .findAllSorted("timestamp", RealmResults.SORT_ORDER_DESCENDING); 

for (int i = 0; i < 20; i++) { 
    // do magic here 
} 
+0

danke..ich denke, das ist die beste lösung ..kann nicht schneller gehen als dies glaube ich –

+0

Nein, das ist fast unmöglich zu schlagen, bis wir die Unterstützung für Indizes für die Datum Daten Zeit hinzufügen. – Emanuelez

6

Diese Frage war fast geschlossen, aber ich fand einen anderen Weg, um die Situation, um herauszufinden, ich weiß nicht, ob die beste Option oder eine gute Praxis, @ChristianMelchior kann das besser sagen als ich (ich sah deine Zusammenarbeit mit Realm-Projekt) ... nun, Codes sagen mehr als Worte.

RealmResults<Appointment> appointments; 
List<Appointment> appointments = appointments.subList(0, appointments.size()); 

Wie wir Ihre Frage beantworten Johan sehen können, können Sie nur den Index ändern, um alle Objekte zu erhalten, die Sie wollen!

+0

einfache Möglichkeit, RealmResults in eine Liste zu konvertieren! Vielen Dank! – Juancho

+1

funktioniert nicht. Geben Sie immer noch eine RealmResults-Liste zurück – KingWu

+0

Obwohl es List zurückgibt, aber wenn Sie versuchen, diese Listenobjekte zu ändern, wird immer noch ein Fehler ausgelöst, da es sich weiterhin um Realm-Objekte und nicht um einfache Listenobjekte handelt. –

0

wie diese

Realm mRealm=Realm.getDefaultInstance(); 

RealmResults<Example> list= mRealm.where(Example.class).findAll(); 
list.subList(list.size()-20,list.size()); 
Verwandte Themen