2013-04-19 16 views
5

In meiner App habe ich einen ContentProvider an eine Tabelle in einer Datenbank mit einem CursorLoader angehängt, der eine ListView in einer meiner Aktivitäten füllt. Diese Tabelle ist standardmäßig leer gefüllt und wird mit Benutzereingabedaten gefüllt. Ich möchte dem Benutzer erlauben, alle ihre gespeicherten Daten vollständig zu löschen, und ich lösche die gesamte Datenbank, wenn diese Option ausgewählt ist. Die Datenbank wird dann im Standardzustand neu erstellt, wenn der Benutzer die App erneut verwendet, genau wie bei der ersten Verwendung der App.Erzwingen eines Inhaltsanbieters zum Zurücksetzen beim manuellen Löschen der Datenbank

Mein Problem ist, wenn ich die Datenbank lösche, der ContentProvider erkennt nicht, dass die Datenbank gelöscht wurde und wenn ich zurück zu meiner Listview-Aktivität gehe, ist die Liste immer noch da. Ich mache auch die App komplett neu laden die ListView Activity, anstatt nur aus dem Speicher wiederaufzunehmen und die Liste ist immer noch da, obwohl die Datenbank leer ist. Die einzige Möglichkeit, den ContentProvider neu zu laden, besteht darin, die App in den Systemeinstellungen zu beenden und sie dann erneut zu öffnen.

Gibt es eine Möglichkeit, den ContentProvider zwangsweise neu zu starten oder ihm mitzuteilen, dass die Daten von außerhalb der ContentProvider-Klasse selbst aktualisiert wurden?

Antwort

1

fand ich die Lösung für mein Problem hier: https://stackoverflow.com/a/8235584/1943155

ich meine dbHelper im onCreate meiner Contentprovider-Klasse ebenso wie in den anderen Post bekommen und eine neue dbHelper bekommen in jeder Methode mein Problem behoben.

0

Sie möchten die Listenansicht mit einem cursorAdapter füllen und den Cursor benachrichtigen, wenn sich der Inhalt im contentProvider geändert hat.

Rufen Sie in Ihrer Delete-Methode Ihrer contentProvider-Implementierung contentResolver.notify . Dadurch wird der durch den Aufruf von contentResolver aufgefüllte Cursor benachrichtigt, dass sich die Daten geändert haben.

+0

Ja, das ist, was ich tue. Das Problem hierbei ist, dass der ContentProvider nur an eine Tabelle meiner Datenbank angefügt ist und eine separate Aktivität, die den Provider nicht verwendet, die gesamte Datenbank löscht, wenn der Benutzer die getApplicationContext(). DeleteDatabase (myDb) durchlaufen möchte. Gibt es eine Möglichkeit, einen Trigger an den Provider zu senden, um ihn neu zu starten/zu aktualisieren, wenn ich keinen direkten Zugriff auf den contentResolver habe? Ich verwende derzeit die Löschmethode in meinem Provider, um einzelne Zeilen aus der Tabelle zu löschen, die für meinen Listenansicht/Cursoradapter verwendet wird, wie Sie vorschlagen. – wynalazca

+0

Wenn Sie einen Loader verwenden, um die Listenansicht zu laden, können Sie den Neustart auch direkt nach dem Löschen der Datenbank aufrufen – wangyif2

+0

Haben Sie das Problem behoben? Haben Sie den Loader-Ansatz ausprobiert? – wangyif2

2

Sie können auch einfach die Löschmethode des Anbieters Inhalte verwenden, ohne eine Auswahl zu definieren:

context.getContentResolver().delete(YourProvider.CONTENT_URI, null, null); 
Verwandte Themen