Java [Android] Wie Daten sinnvoll aus DB laden?

T

Tersus

Gast
Mahlzeit,

ich möchte recht viele und auch komplexer verknüpfte Entitäten aus meiner SQLite Datenbank laden. Ich nutze GreenDao als ORM und diesen Framework ist schon spitze.

Nun kann ich mir meine Hauptentitäten als Liste von GreenDao geben lassen. Das sind dann ca. 1000 komplexe Datentypen mit Referenzen auf wiederum andere komplexe Datentypen, usw.. Bilder sind darin auch enthalten.
Nun halte ich es für wenig sinnvoll, sofort alles aus der Datenbank in den RAM zu laden.
GreenDao holt leider gleich alles raus.
Ich kann mir aber auch einen Cursor für die Tabelle geben lassen.

Meine RecyclerView ist so implementiert, dass sie einen zweiten Pfaden startet, sobald das Ende der Liste ist erreicht ist.
Schön wäre ja, wenn ich erstmal nur die ersten 20 Entitäten aus der DB holen könnte und, sobald ich an das Ende komme, die nächsten 20 nachlade.

Funktioniert das mit einem Cursor und ist das der Weg, den man zu gehen hat? Ein Cursor läuft ja nur vorwärts. Wenn das Ende der Liste erreicht, laufe 20 mal weiter usw..

Noch eine Frage: Wie relevant sind die Sortierzeiten? Ich will den Cursor über eine sortierte Tabelle nach Uniqute 'Name' laufen lassen.
 
Seit wann läuft ein Cursor nur vorwärts. Wenn GreenDao das nur kann, Schande über das Framework.
Implementier deinen eigenen Cursor, dann kannst du zufällig laden.
Wenn ich die Dokumenta​tion (von GreenDao) richtig lese, kannst du ja einzelne Datensätze laden (im QueryBuilder .offset (n).limit(1)). Damit kommst du schon ziemlich weit.

Die Variante mit einem​ Cursor ist schon der richtige Weg. Mit Android ListViews nimmt man ja normalerweise eine Adapter, das wäre die "native" Methode, um das umzusetzten. Das muss natürlich auch auf dein Problem passen.

Wie relevant sind Sort​ierzeiten? Mit dem richtigen Index gar nicht, aber sonst => benchen und schauen.
 
Wieso verwendest du nicht ein Limit mit Offset:

Aus der Doku:

QueryBuilder<T> limit(int limit) Limits the number of results returned by queries.
QueryBuilder<T> offset(int offset) Sets the offset for query results in combination with limit(int).

Somit könntest du das Problem wie Folgt lösen.
(beispiel)
Code:
while(myQuery.hasNext())
              myQuery.offset(i).limit( i  += 20 );

Sortierzeiten sind fast immer vernachlässigbar.. außer du hast eine wirklich sehr große DB. Zudem verläuft eine Sortierung im DBMS meistens schneller als eine selber implementierte.

greetz
 
Zurück
Oben