7

Zajmuję się tworzeniem aplikacji opartej na architekturze Google IO presentation przy użyciu pierwszego podejścia. Zasadniczo mam Service, ContentProvider wspierane przez SQLite DB i również używam Loader s.Sposób aktualizacji interfejsu użytkownika po zmianie bazy danych

Potrzebuję sposobu na aktualizację interfejsu użytkownika po wystąpieniu zmian w mojej bazie danych. Na przykład użytkownik może chcieć dodać przedmiot do swojego koszyka. Po wstawieniu identyfikatora przedmiotu do tabeli koszyków chcę zaktualizować interfejs użytkownika. Jakie podejście powinienem zastosować? Dotychczas widziałem bardzo mało informacji na temat ContentObserver. Czy to jest droga?

+0

element w koszyku jest połączony z operacją * wstaw * w bazie danych? – Blackbelt

+0

Nie jestem pewien, co masz na myśli, ale zasadniczo po zakończeniu żądania http aktualizuję odpowiedni wiersz w tabeli bazy danych, który to stan powinien być w jakiś sposób odzwierciedlany przez interfejs użytkownika. Mój problem polega na tym, że nie mogę znaleźć sposobu na poinformowanie UI o aktualizacji po zmianie danych DB. – midnight

+0

czy zadzwoniłeś do notifyChange po aktualizacji wiersza? – Blackbelt

Odpowiedz

6

W sposobie query swój ContentProvider dołączyć słuchacza do zwracanego kursora:

Cursor cursor = queryBuilder.query(dbConnection, projection, selection, selectionArgs, null, null, sortOrder); 
cursor.setNotificationUri(getContext().getContentResolver(), uri); 

Następnie w swoim insert/update/delete metod użyć kodu jak poniżej:

final long objectId = dbConnection.insertOrThrow(ObjectTable.TABLE_NAME, null, values); 
final Uri newObjectUri = ContentUris.withAppendedId(OBJECT_CONTENT_URI, objectId); 
getContext().getContentResolver().notifyChange(newObjectUri , null); 

Twój CursorLoader będzie zostać powiadomiony, a OnLoadFinished(Loader, Cursor) zostanie ponownie wywołany.

Jeśli nie używasz Loader The ContentObserver jest droga, za pomocą kilku linijek kodu użytkownik jest powiadamiany o zmianach db (ale trzeba będzie ponowić kwerendę ręcznie).

private ContentObserver objectObserver = new ContentObserver(new Handler()) { 
    @Override 
    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 
     restartObjectLoader(); 
    } 
}; 

Pamiętaj, aby zadzwonić onResume():

getContentResolver().registerContentObserver(ObjectProvider.OBJECT_CONTENT_URI, false, objectObserver); 

oraz w onPause():

getContentResolver().unregisterContentObserver(objectObserver); 

Aktualizacja: UI Zmiany Jest to większy temat, ponieważ zależy to od Adapter Ciebie użyj, aby wypełnić ListView lub RecyclerView.

CursorAdapter W onLoadFinished(Loader loader, Cursor data)

mAdapter.swapCursor(data); 

ArrayAdapter W onLoadFinished(Loader loader, Cursor data)

Object[] objects = transformCursorToArray(data); //you need to write this method 
mAdapter.setObjects(objects); //You need to wrie this method in your implementation on the adapter 
mAdapter.notifyDataSetChange(); 

RecyclerView.Adapter W onLoadFinished(Loader loader, Cursor data)

Object[] objects = transformCursorToArray(data); //you need to write this method 
//Here you have more mAdapter.notify....() 

Przeczytaj from here, aby uzyskać inny sposób powiadomienia o RecyclerView.Adapter.

2

Jeśli używasz listy, możesz ponownie wypełnić adapter i ustawić go na liście. Lub spróbuj poinformować o zmianie zestawu danych.

Powiązane problemy