android – CursorLoader & SQLite ohne Inhaltsanbieter
Lesezeit: 4 Minuten
Dorjeduck
Ich weiß, dass dies diskutiert wurde, wollte aber nach dem aktuellen Stand der Angelegenheit fragen. Muss ich einen ContentProvider erstellen, um CursorLoader in Verbindung mit einer SQLite-Datenbank zu verwenden?
ich fand
CursorLoader-Nutzung ohne ContentProvider
Sieht genau so aus, wie ich es mir erhofft hatte, wie Emmby kommentierte
Benutzer sollten sich einer Einschränkung bewusst sein, nämlich dass es keinen Mechanismus zum Aktualisieren bei Datenänderungen gibt (wie es Loader tun sollten).
Um die automatische Neuabfrage zu nutzen, müssen Sie jedoch denselben Loader für die Benutzeroberfläche und für die Updates verwenden, was die Verwendbarkeit für Hintergrunddienste einschränkt.
Natürlich möchten wir bei der Verwendung von LoaderManager alle Vorteile nutzen, für die er eingeführt wurde. Meine Frage ist also, ob es eine Möglichkeit gibt, LoaderManager in Verbindung mit einer SQLite-Datenbank zu verwenden, ohne einen Inhaltsanbieter implementieren zu müssen, und dennoch alle Vorteile davon zu haben.
Vielen Dank
Alex Lockwood
Die beiden Implementierungen, die Sie in Ihrem Beitrag erwähnen, bieten beide alle Vorteile der CursorLoaderaußer die Möglichkeit, Benachrichtigungen zu erhalten, wenn sich der zugrunde liegende Inhalt ändert.
Ich habe mich in letzter Zeit viel damit beschäftigt und kann Ihnen mit Zuversicht sagen, dass die Android-API derzeit keine Möglichkeit bietet, dies nur mit einem Raw zu tun SQLiteDatabase (es liefert nur die ContentResolver#notifyChange() und Cursor#setNotificationUri() Methoden, die verwendet werden, um alle zu benachrichtigen Cursors unter einer bestimmten Benachrichtigung registriert Uri).
Das heißt, Ihre Optionen sind jetzt:
Implementieren Sie selbst einen Beobachter, der Benachrichtigungen von der empfangen kann SQLiteDatabase wenn sich der Inhalt ändert, und ist irgendwie in der Lage, diese Benachrichtigungen an alle vorhandenen weiterzuleiten Loaders in Ihrer Bewerbung. Ich habe eine ziemlich umfangreiche geschrieben Blogeintrag zur Umsetzung LoaderDas könnte sich als nützlich erweisen, wenn Sie sich dieser Herausforderung stellen möchten. Oder…
Verwenden Sie Mark Murphys LoaderEx Bibliothek und nehmen Sie nur Datenbankänderungen mit der AsyncTask Operationen, die seine Bibliothek bietet. Beachten Sie, dass der Grund, warum seine Aufgaben die aktualisieren Loader ist, weil sie anrufen onContentChanged auf der Loader unmittelbar nachdem das Einfügen/Aktualisieren/Löschen durchgeführt wurde, wodurch die effektiv mitgeteilt wird Loader dass sich der Inhalt geändert hat und dass er seine Daten aktualisieren sollte.
Verwenden Sie einfach eine ContentProvider mit einer CursorLoader und Sie können die verwenden ContentResolver#notifyChange() Methode zur Benachrichtigung CursorLoader dass eine Inhaltsänderung stattgefunden hat.
Ich versuche, eine bessere Lösung zu finden, und ich werde mich in Zukunft wieder melden, wenn ich jemals eine finde/implementiere, aber im Moment müssen diese reichen.
Super, danke für diese ausführliche Antwort. In Anbetracht dessen denke ich, dass ich einen Inhaltsanbieter implementieren sollte, auch wenn es für jede kleine Datenbank, die ich auf dem Display auflisten möchte, wie ein Overkill erscheint. Hmmm …
– Dorjeduck
13. Oktober 2012 um 3:04 Uhr
@dorjeduck Ja, das mache ich normalerweise auch. Ich möchte wirklich einen Weg finden, einen Weg zu finden, es zu tun … Ich bin noch nicht fertig damit 🙂
– Alex Lockwood
13. Oktober 2012 um 3:26 Uhr
Liebe androiddesignpatterns.com übrigens – sehr hilfreich und womit ich mich beschäftigen möchte, nachdem ich meine ersten Schritte in der Android-Welt gemacht habe
– Dorjeduck
13. Oktober 2012 um 4:27 Uhr
@dorjeduck Danke! Bis dahin versuche ich noch ein paar coole Sachen zu schreiben 😛
– Alex Lockwood
13. Oktober 2012 um 14:41 Uhr
@AlexLockwood, bedeutet es, dass wir zuerst einen ContentProvider implementieren müssen, um Daten asynchron zu laden und Benachrichtigungen über Datenänderungen zu erhalten (und es wird empfohlen?). Ich dachte, der Zweck von ContentProvidern besteht darin, Daten mit anderen Anwendungen zu teilen, wie es in ihrer Beschreibung steht, aber es sieht so aus, als wäre dies nicht der einzige Zweck.
– Eugen
24. Dezember 2013 um 8:03 Uhr
Hier ist meine Lösung in meinem onCreateLoader
{
Uri u = Uri.parse("content://what_string_you_want");
return new CursorLoader(this, yourURI, projection, null, null, null) {
private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
@Override
public Cursor loadInBackground() {
Cursor c = YOUR_DATABASE.doYourQuery(...);
if (c != null) {
// Ensure the cursor window is filled
c.getCount();
c.registerContentObserver(mObserver);
}
c.setNotificationUri(getContext().getContentResolver(), getUri());
return c;
}
};
}
Wie wäre es, wenn ein boolescher Wert in den gemeinsamen Einstellungen falsch ist? Aktualisieren Sie den Inhalt, wenn dieser boolesche Wert wahr ist…. und wenn eine der Operationen die zugrunde liegende Datenbank ändert changelistener können Sie Änderungen direkt nach dem Aufruf der entsprechenden Methoden live erhalten
11447700cookie-checkandroid – CursorLoader & SQLite ohne Inhaltsanbieteryes