8

Die App verfügt über Daten in einer SQLite-Datenbank. Die Benutzeroberfläche ist in erster Linie eine RecyclerView. Die Frage ist, wie man am besten Daten von der Datenbank in die UI überträgt, während man den Hauptthread fernhält.SQLite-Daten zu einem RecyclerView

Ursprünglich wollte ich einen CursorLoader, ContentProvider und RecyclerView verwenden. Aber wenn man es liest, sieht es so aus, als ob RecyclerView keine von Cursors gelieferten Daten sofort unterstützt. Dang.

Das lässt mich dann mit ein paar andere Optionen ...

  1. AsyncTask die Daten laden, legen Sie sie in Modellobjekte und gelangen in den RecyclerView Adapter. Abgesehen davon, dass es hässlich ist, ist es nicht konfigurationsfreundlich.

  2. Ein benutzerdefinierter Loader, der die Daten aus SQL lädt und in Modellobjekte verschiebt.

  3. Verwenden Sie ein Cursor-Ladeprogramm, und wenn es zurückgibt, durchläuft der Cursor es, um die Daten in Modellobjekte zu schieben. Ich vermute, dass dies am Hauptthread auftreten und die Leistung beeinträchtigen könnte.

  4. Verwenden Sie Otto, um eine Anforderungsnachricht zum Anfordern von Daten zu senden, und geben Sie dann eine Modellobjektsammlung per Rückmeldung zurück. Es kann ~ 500 Objekte geben, also denke ich, dass ich Otto dabei missbrauchen könnte.

Wenn ich eine Sammlung von Modell bin mit Objekten anstelle eines Cursor ich weniger Nutzen zu einem Contentprovider sehen, und ich auch die Möglichkeit, für die Benutzeroberfläche auf die automatische Aktualisierung auf Datenänderungen verlieren (was nützlich sein kann) .

Keine dieser Optionen spricht viel an, gibt es einen besseren Weg? Die App ist unter Zeitdruck, was auch immer es sein muss, muss ziemlich schnell implementiert werden. Leider muss die Benutzeroberfläche horizontal scrollen und nur Lollipop als Ziel haben, daher scheint RecyclerView eine bessere Wette zu sein als ListView.

+0

Ich benutze Methode 3 in einer meiner Anwendungen und in der OnLoadFinished spawn ich einen neuen Thread die Erstellung der Modellobjekte aus den Daten. Ich hatte noch kein Problem mit dieser Methode – tyczj

+1

Siehe https://gist.github.com/Shywim/127f207e7248fe48400b und bitte nicht iterieren über den Cursor, es hat wenig Sinn und wie Sie sagten, verschlechtert es die Leistung – pskink

+0

Würden Sie nicht in der Lage sein, den Cursor zu nehmen und ihn in eine andere Aufgabe zu schieben? Immer noch nicht wünschenswert. –

Antwort