Muss eine Aktivität oder ein Fragment einen separaten Lader für den Typ jedes Datenbankvorgangs haben?
Frage
Die von Google empfohlene Weise (unter Verwendung der Android-Support-Bibliothek) für ein Fragment oder eine Aktivität, um mit einer SQLite-Datenbank zu interagieren, erfolgt über einen Loader, der AsyncTaskloader erweitert und ähnlich wie der Cursorloader für ContentProviders funktioniert.
Eine einzelne Aktivität oder ein Fragment kann auf verschiedene Weise mit einer Datenbank interagieren und Daten in einem oder mehreren Tabellen aktualisieren, löschen und abfragen. Aber da ein Lader nur einen Ort hat, an dem Datenbankmanipulation durchgeführt werden kann (dh in loadInBackground()
), wird der Entwickler erwartet, dass er für jede Art von Interaktion einen separaten Lader schreibt, zumal dies der einzige Weg zu sein scheint, das Verhalten in Parametrisierung zu erscheint loadInBackground()
ist durch Übergabe von Argumenten an den Konstruktor des Laders über die args
Argument an LoaderManager.initLoader()
?
Vielen Dank.
Lösung
Wenn Sie keine verwenden, ContentProvider
, dh bei direkter Verwendung von SQLite, verwenden Sie AsyncTaskLoader
Wenn der Satz von Datenbankvorgängen, die ausgeführt werden sollen, zurückgibt a Cursor
. Der Satz kann jede Art von Operation enthalten - Aktualisierung, Abfrage, Löschen, Einfügen. Diese Operationen sollten in ausgeführt werden in AsyncTaskLoader.loadInBackground()
.
Wenn der Satz der Datenbankvorgänge nicht zu a führt Cursor
Verwenden Sie eine zurückgegeben, verwenden Sie eine AsyncTask
. In diesem Fall sollten die Vorgänge in ausgeführt werden in AsyncTask.doInBackground()
.
Andere Tipps
Die Verwendung von a hat zwei wichtige Vorteile CursorLoader
in Ihrer App über Activity.managedQuery():
- Die Abfrage wird für Sie auf einem Hintergrundfaden behandelt (mit freundlicher Genehmigung des Aufbaus
AsyncTaskLoader)
So blockieren große Datenabfragen die Benutzeroberfläche nicht. Dies ist etwas, was die Dokumente Ihnen empfohlen haben, wenn Sie eine Ebene verwendenCursor
, aber jetzt ist es unter der Motorhaube gemacht. CursorLoader
ist automatisch. Zusätzlich zur Ausführung der ersten Abfrage registriert der Cursorloader aContentObserver
mit dem von Ihnen angeforderten und ruft des DatensatzesforceLoad()
auf sich selbst, wenn sich der Datensatz ändert. Dies führt dazu, dass Sie erhaltenasync
Rückrufe jederzeit ändert sich die Daten, um die Ansicht zu aktualisieren.
Jede Laderinstanz wird auch durch den Singular behandelt LoaderManager
, Sie müssen den Cursor also immer noch nicht direkt verwalten, und jetzt kann die Verbindung noch über eine einzige weiterhin bestehen bleiben Activity. LoaderManager.initLoader()
und LoaderManager.restartLoader()
Ermöglichen Sie, dass Sie sich wieder mit einem vorhandenen Loader verbinden, der bereits für Ihre Abfrage eingerichtet ist, und erhalten Sie in einigen Fällen sofort die neuesten Daten, wenn sie verfügbar sind.
Ihre Aktivität oder Ihr Fragment wird die wahrscheinlich jetzt implementieren LoaderManager
.Callback -Schnittstelle. Berufung initLoader()
führt zu der OnCreateLoader () -Methode, bei der Sie die Abfrage und eine neue konstruieren CursorLoader
Instanz, falls erforderlich. Das onLoadFinished()
Die Methode wird jedes Mal, wenn neue Daten verfügbar sind, entlassen und enthalten den neuesten Cursor, den Sie an die Ansicht anhängen oder auf andere Weise durchlaufen können.
Außerdem gibt es ein ziemlich gutes Beispiel für all diese Anpassungen auf der LoaderManager
Klassendokumentationsseite: http://developer.android.com/reference/android/app/loadermanager.html
Ich hoffe, das hilft!
Basierend auf den vorherigen Antworten bin ich mir nicht sicher, ob Sie genau das fragen. Aber ja, Sie müssen einen Loader mit seiner eindeutigen ID für jeden Datensatz erstellen, dh jede Art von Abfrage, die Sie ausführen.