CursorLoader Nutzung ohne ContentProvider
Android-SDK-Dokumentation sagt, dass startManagingCursor()
Methode ist depracated:
Diese Methode ist veraltet. Verwenden Sie die neue CursorLoader Klasse mit LoaderManager statt; dies ist auch auf älteren Plattformen über den Android compatibility package. Diese Methode erlaubt es, die Tätigkeit mit der Pflege der angegebenen Cursor-Lebenszyklus basierend auf der Aktivität lifecycle. Das ist, wenn die Aktivität beendet ist, wird es automatisch den Anruf deaktivieren() auf den angegebenen Cursor, und wenn es später neu gestartet wird erfolgt ein Aufruf requery() für Sie. Wenn die activity zerstört wird, werden alle verwalteten Cursor wird automatisch geschlossen. Wenn Sie auf HONEYCOMB oder höher, sollten Sie stattdessen die Verwendung LoaderManager statt, über getLoaderManager()
So, ich möchte CursorLoader
. Aber wie kann ich es mit custom CursorAdapter
und ohne ContentProvider
, wenn ich muss URI im Konstruktor von CursorLoader
?
warum sind wir mit CursorAdapter ohne ContentProvider bitte schlagen Sie mich stackoverflow.com/questions/20419278/...
InformationsquelleAutor sealskej | 2011-08-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schrieb ich eine einfache CursorLoader, das nicht mit einem content-provider:
Braucht es nur die
AsyncTaskLoader
Klasse. Entweder die in Android 3.0 oder höher, oder derjenige, der kommt mit dem Kompatibilitäts-Paket.Ich auch schrieb ein
ListLoader
, die kompatibel mit demLoadManager
und verwendet, um eine generischejava.util.List
Sammlung.Vielen Dank für das Beispiel. Was ist die Lizenz im Zusammenhang mit Ihrer Klasse. Wie kann es wiederverwendet werden?
Lizenz ist Apache 2.0; Sie können es wiederverwenden, wo/Wann immer Sie wollen. Lassen Sie mich wissen, wenn Sie irgendwelche Verbesserungen.
Tolle Sachen! Benutzer sollten sich bewusst sein, eine Einschränkung, die ist, dass es keinen Mechanismus zur Aktualisierung auf änderungen der Daten (wie die Lader zu tun)
hier haben Sie Mann: ListLoader und SupportListLoader
InformationsquelleAutor Cristian
Schreiben Sie Ihre eigenen loader verwendet deine Datenbank-Klasse anstelle von einem content-provider. Der einfachste Weg ist es, nur die Quelle der
CursorLoader
Klasse aus die Kompatibilitäts-Bibliothek, und ersetzen provider Abfragen mit Abfragen, um Ihre eigenen db-helper Klasse.Dies ist der einfachste Weg, meiner Meinung nach. In meiner app habe ich erstellt eine
CursorLoader
descendat zum verwalten einer SQLite-cursor, appart aus dem Konstruktor brauchte ich nur das überschreiben derloadInBackground
Methode zu ersetzen, die dem Anbieter Abfrage mit meinem cursor queryInformationsquelleAutor Nikolay Elenkov
Den SimpleCursorLoader ist eine einfache Lösung, aber es unterstützt nicht die Aktualisierung der loader, wenn sich die Daten ändern. CommonsWare hat eine loaderex Bibliothek, fügt eine SQLiteCursorLoader und unterstützt re-Abfrage auf den Daten ändert.
https://github.com/commonsguy/cwac-loaderex
InformationsquelleAutor emmby
Eine Dritte option wäre zu einfach überschreiben
loadInBackground
:Diese auch nehmen Pflege der re-Abfragen Ihren cursor, wenn sich die Datenbank ändert.
Einzige Einschränkung: Sie müssen definieren, ein anderer Beobachter, da Google in seiner unendlichen Weisheit beschlossen, zu machen, Ihnen Paket private. Wenn Sie die Klasse in gleichen Paket wie das original (oder die compat) Sie können tatsächlich verwenden die original-Beobachter zu werden. Der Beobachter ist ein sehr leichtes Objekt und ist nicht irgendwo anders, das macht nicht viel Unterschied.
Es muss nicht unbedingt ein ContentProvider. Aber der cursor muss registriert werden, um eine Benachrichtigungs-uri (setNotificationUri), und Sie dann benachrichtigt werden muss, die von jemandem (in der Regel ein ContentProvider, aber alles sein kann) durch Aufruf von ContentResolver.notifyChange.
Ja. auf Ihrem CustomLoader ist
loadInBackground()
, vor der Rückkehr der cursor, sagencursor.setNotificationUri(getContext().getContentResolver(), uri);
der uri kann nur von zufälligen Zeichenfolge, wieUri.parse("content://query_slot1")
. Wie es scheint kümmern sich nicht die uri, die wirklich existieren oder nicht. Und sobald ich das getan-Betrieb auf DB. SagengetContentResolver().notifyChange(uri, null);
würde den trick tun. Dann kann ich erstellen paar "query-uri-slot" eine Konstante-Datei für die app mit der kleinen Anzahl der Abfrage. Ich test stecken Sie den DB-Rekord in Laufzeit und es scheint zu arbeiten, aber ich immer noch Zweifel, es ist eine gute Praxis, onit. Jede Anregung?Ich bin mit dieser Methode mit @Yeung 's Vorschlag und alles funktioniert, einschließlich der automatischen nachladen der cursor auf Datenbank-update.
doesnt benötigen unregisterContentObserver?
InformationsquelleAutor Timo Ohr
Die Dritte option vorgeschlagen, Timo Ohr, zusammen mit den Kommentaren von Yeung, stellen die einfachste Antwort (Occam ' s razor). Unten ist ein Beispiel für eine komplette Klasse, die für mich funktioniert. Es gibt zwei Regeln für die Verwendung dieser Klasse.
Jeder Zeit, dass die zugrunde liegende Datenbank ändert (z.B. nach dem einfügen oder löschen), rufen Sie
wo myUri, ist der gleiche zurückgegeben, die von Ihrer Implementierung der Methode getContentUri().
Hier ist der code für die Klasse, die ich verwendet habe:
InformationsquelleAutor John Moore