Mam niestandardową ContentProvider
, która zarządza dostępem do bazy danych SQLite. Aby załadować zawartość tabeli bazy danych w ListFragment
używam LoaderManager
z CursorLoader
i CursorAdapter
:Android ContentProvider wywołuje bursts setNotificationUri() do CursorAdapter, gdy wiele wierszy jest wstawianych z operacją wsadową.
public class MyListFragment extends ListFragment implements LoaderCallbacks<Cursor> {
// ...
CursorAdapter mAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new CursorAdapter(getActivity(), null, 0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(LOADER_ID, null, this);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(getActivity(), CONTENT_URI, PROJECTION, null, null, null);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
mAdapter.swapCursor(c);
}
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
Baza danych SQLite zostanie zaktualizowany przez zadanie w tle, który pobiera liczbę elementów z usługą internetową i wstawia te elementy do bazy danych za pomocą operacji wsadowych ContentProvider
().
Nawet jeśli jest to operacja partia, ContentProvider#insert()
jest wywoływana za każdy wiersz jest wstawiany do bazy danych, a w obecnej realizacji, ContentProvider
rozmowy setNotificationUri()
dla każdego polecenia insert.
Powoduje to, że CursorAdapter
odbiera serie powiadomień, co powoduje, że interfejs jest aktualizowany zbyt często, co powoduje denerwujący efekt migotania.
Najlepiej, gdy operacja wsadowa jest w toku, powinien istnieć sposób powiadomienia ContentObserver
tylko na końcu każdej operacji wsadowej, a nie przy każdym poleceniu wstawiania.
Czy ktoś wie, czy jest to możliwe? Proszę zauważyć, że mogę zmienić implementację ContentProvider
i zastąpić każdą z jej metod.
Należy rozważyć wykonanie/oparcie dostawcy na czymś takim jak [SQLiteContentProvider] (http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android-apps/2.2_r1.1 /com/android/providers/calendar/SQLiteContentProvider.java/?v=source) - zapewnia wiele podstaw miłego i funkcjonalnego dostawcy opartego na SQLite - a jeśli to zrobisz - powinieneś po prostu użyć bulkInsert lub applyBatch aby zrobić twoje "inserty masy". Dodatkową korzyścią jest to, że twoje wkładki luzem zostaną wykonane w transakcji, która przyspiesza ich bardzo dużo. – Jens
@ Dziękuję bardzo za wskaźnik, to wygląda dokładnie to, co byłem po. Tylko jedno pytanie: kto opracował i wypuścił ten kod? Z nagłówka wynika, że jest częścią Projektu Open Source Android, ale jeśli tak jest, dlaczego nie został wypuszczony przez Google za pomocą standardowego zestawu SDK Androida? –
Jest to część projektu AOSP, ale nie opublikowana w SDK - dlaczego nie wiem, ponieważ włączenie go uniemożliwiłoby wielu ludziom pisanie brzydkich implementacji "ContentProvider". – Jens