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.

War es hilfreich?

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():

  1. 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 verwenden Cursor, aber jetzt ist es unter der Motorhaube gemacht.
  2. CursorLoader ist automatisch. Zusätzlich zur Ausführung der ersten Abfrage registriert der Cursorloader a ContentObserver mit dem von Ihnen angeforderten und ruft des Datensatzes forceLoad() auf sich selbst, wenn sich der Datensatz ändert. Dies führt dazu, dass Sie erhalten async 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top