2013-04-19 6 views
5

W mojej aplikacji mam ContentProvider dołączony do tabeli w bazie danych z CursorLoader, który wypełnia ListView w jednym z moich działań. Ta tabela jest wypełniona domyślnie i wypełniona danymi wejściowymi użytkownika. Chcę zezwolić użytkownikowi na całkowite usunięcie wszystkich przechowywanych danych i usuwam całą bazę danych po wybraniu tej opcji. Baza danych jest następnie odtwarzana w jej domyślnym stanie, gdy użytkownik ponownie zaczyna korzystać z aplikacji, tak jak przy pierwszym użyciu aplikacji.Jak zmusić dostawcę treści do zresetowania podczas ręcznego usuwania bazy danych

Mój problem jest, gdy usuwam bazę danych, ContentProvider nie wykrywa, że ​​baza danych została usunięta i kiedy wracam do mojej aktywności listview, lista nadal tam jest. Sprawiam też, że aplikacja całkowicie przeładuje działanie ListView, zamiast tylko wznawiać pracę z pamięci, a lista wciąż istnieje, nawet jeśli baza danych jest pusta. Jedynym sposobem na przeładowanie ContentProvider jest zabicie aplikacji w ustawieniach systemowych, a następnie ponowne jej otwarcie.

Czy istnieje sposób na ponowne uruchomienie obiektu ContentProvider lub poinformowanie go, że dane zostały zaktualizowane spoza klasy ContentProvider?

Odpowiedz

0

Chcesz uzupełnić listę za pomocą obiektu cursorAdapter i powiadomić kursor, gdy zmieni się zawartość w obiekcie contentProvider.

W swojej metodzie usuwania swojej implementacji contentProvider, zadzwoń pod numer contentResolver.notify . To powiadomi kursor wypełniony przez wywołanie contentResolver, że nastąpiła zmiana w danych.

+0

Tak, to co robię. Problem polega na tym, że ContentProvider jest dołączony tylko do jednej tabeli mojej bazy danych, a oddzielna Aktywność, która nie używa dostawcy, usuwa całą bazę danych, gdy użytkownik chce przejść przez getApplicationContext(). DeleteDatabase (myDb). Czy istnieje sposób wysłania wyzwalacza do dostawcy, aby ponownie uruchomić/odświeżyć go, gdy nie mam bezpośredniego dostępu do contentResolver? Obecnie używam metody delete w moim dostawcy, aby usunąć pojedyncze wiersze z tabeli, która jest używana dla mojego listview/cursoradapter, jak sugerujesz. – wynalazca

+0

Jeśli używasz programu ładującego do załadowania listy, możesz również po prostu wywołać ponowne uruchomienie w programie ładującym zaraz po usunięciu bazy danych – wangyif2

+0

Czy rozwiązałeś ten problem? Czy próbowałeś podejścia do ładowarki? – wangyif2

2

Można też po prostu użyć metody usuwania dostawcy zawartości bez definiowania wybór:

context.getContentResolver().delete(YourProvider.CONTENT_URI, null, null); 
Powiązane problemy