Java [Android] Wie funktioniert ein Cursor?

T

Tersus

Gast
Guten Tag,

ich habe gerade eine schockierende Erfahrung gewonnen.

Typischer Fall: ListView mit SimpleCursorAdapter und einem Cursor.

Der Cursor läuft über eine Tabelle und die Selektionen werden in der ListView angezeigt. Nun füge ich eine neue Zeile in die Tabelle, über welche der Cursor läuft, ein und stelle fest:

cursor.getCount() ist unverändert und cursor.isLast() gibt true zurück, obwohl ein neues Element in die Tabelle eingefügt wurde.

Heißt das, dass ein Cursor gar nicht direkt auf die SQLite DB zugreift, sondern die Zeilen in einem Puffer speichert!?
 
Wenn du einen sich selbst aktualisierenden Cursor brauchst, solltest du einen CursorLoader benutzen.
 
requery() ist veraltet und sollte nicht mehr verwendet werden.

Ja, den CursorLoader nutze ich aktuell, aber auch hier bin ich nicht ganz zufrieden.

Wenn meine Tabelle 999 Einträge hat, die ich in der ListView per SimpleCursorAdapter darstellen möchte, dann ein weiterer - also 1000ster - Eintrag in die Tabelle erfolgt und die Liste per CursorLoader aktualisiert wird, dann wird nicht einfach nur der neue Eintrag unten an gehangen, nein, die Einträge werden komplett neu ausgelesen und aufgebaut. :freak:
 
Danke für den Hinweis, dass requery veraltet ist. Das habe ich durchaus auch selbst gelesen. Ich hatte mit dem Hinweis auf die Existenz dieser Methode nur auf die logische Schlussfolgerung bei dir gehofft, dass du natürlich kein direktes handle auf die DB-Tabelle hast, sondern eine Kopie.

Ich habe mit Android noch nicht viel gemacht, aber meiner Meinung nach, machst du etwas grundlegend falsch, wenn du alle 1000 Einträge deiner Tabelle in den Speicher lädst. Das klingt nach Ressourcenverschwendung. Und wenn du das korrigierst und immer nur genau die 10 (oder weniger) Einträge rausziehst, die du überhaupt anzeigen kannst (mehr passt ja eh nicht sinnvoll nutzbar auf einen so kleinen Bildschirm), dann hast du auch mit dem Nachladen und Neuaufbau des Models der Liste keine Probleme.
 
Also ich hatte bisher keine Probleme mit dem Loader, aber ich wäre als Nutzer ehrlich gesagt auch zu faul durch 1000 Einträge zu scrollen ohne gescheiten Filter oder Pagination.
 
Tumbleweed schrieb:
Ich habe mit Android noch nicht viel gemacht, aber meiner Meinung nach, machst du etwas grundlegend falsch, wenn du alle 1000 Einträge deiner Tabelle in den Speicher lädst. Das klingt nach Ressourcenverschwendung.
Genau das ist ein Teil der Frage, wie ein Cursor funktioniert. Ich mache doch nichts anderes, als bereits implementierte Klassen zu nutzen. Ich weiß also gar nicht, wenn ich diese Klassen nutze, ob wirklich alle 1000 Einträge aus der SQLite DB, die jetzt nur aus unspektakulären Strings bestehen, im Hauptspeicher landen oder ob der SimpleCursorAdapter bereits so intelligent implementiert wurde, dass er nur die Elemente, die gerade angezeigt werden plus Puffer, im Speicher hält.
Letzteres geht aber halt nur, wenn ein Cursor, wie eine ArrayList arbeitet und das ist glaube ich nicht der Fall. Bei einem Cursor geht es ja nur vorwärts, oder wieder bis an den Anfang.

Aber gut. Vielleicht sind die Überlegungen sinnlos. Solange alles in vertretbarer Zeit angezeigt wird, ist ja alles im Grünen.


@MoOderSo
Das ist richtig. Die 1000 Beiträge sollten nur einen Extremfall darstellen, weil es bei meiner Frage halt um Performance geht.
 
Cursor kann auch in die andere Richtung mit moveToPrevious() oder moveToPosition(int position).
Und der Adapter ist eigentlich so "intelligent", dass er nur die Views baut, die gerade angezeigt werden. Brauchst bloß mal im ViewBinder mitzuloggen, welche Datensätze er gerade zu Views verarbeitet.
 
Zurück
Oben