android-CursorLoader & SQLite без контент-провайдера
Я знаю, что это обсуждалось, но я хотел спросить о текущем состоянии вопроса. Должен ли я создать ContentProvider для использования CursorLoader в связи с базой данных sqlite?
нашел
использование CursorLoader без ContentProvider
выглядит именно то, что я надеялся еще, как прокомментировал Эмби
- пользователи должны знать об одном ограничении, которое заключается в том, что у него нет механизма обновления при изменении данных (как Погрузчики должны делать)
поэтому упоминается другое решение
https://github.com/commonsguy/cwac-loaderex
еще раз указывается на некоторый недостаток
- однако, чтобы использовать автоматический повторный запрос, вам нужно использовать один и тот же загрузчик для пользовательского интерфейса, а также для обновлений, ограничивая его удобство для фоновых служб.
конечно при использовании LoaderManager мы хотим получить все преимущества, ради которых он был введен. Поэтому мой вопрос заключается в том, есть ли способ использовать LoaderManager в связи с базой данных sqlite без необходимости реализации контент-провайдера, но все же имеет все преимущества.
спасибо
2 ответов:
две реализации, которые вы упоминаете в своем посте, предлагают все преимущества
CursorLoaderкроме возможность получать уведомления при изменении содержания.Я изучал это много в последнее время, и я могу с уверенностью сказать вам, что Android API в настоящее время не предоставляет средства для этого только с raw
SQLiteDatabase(Он предоставляет толькоContentResolver#notifyChange()иCursor#setNotificationUri()методы, которые используются для уведомления всехCursors зарегистрирован под определенным уведомлениемUri).тем не менее, ваши варианты прямо сейчас:
реализовать наблюдатель самостоятельно, который способен получать уведомления от
SQLiteDatabaseкогда содержимое изменяется, и каким-то образом может передавать эти уведомления всем существующимLoaderв вашем приложении. Я написал довольно обширный блоге о том, как реализоватьLoaders, что может пригодиться, если вы хотите взять на себя эту задачу. Или...используйте Марк Мерфи
LoaderExбиблиотека и только вносить изменения в базу данных с помощьюAsyncTaskоперации его библиотеки. Обратите внимание, что причина, по которой его задачи обновляютLoader- это потому, что они называютonContentChangedнаLoaderсразу после вставки / обновления / удаления выполняется, эффективно сообщаяLoader, что содержание изменилось и что он должен обновить свои данные.просто использовать а
ContentProviderСCursorLoaderи вы можете использоватьContentResolver#notifyChange()способ уведомленияCursorLoaderЧто произошло изменение содержимого.Я пытаюсь найти лучшее решение, и я сообщу об этом в будущем, если я когда-нибудь найду/реализую его, но пока это нужно будет сделать.
вот мое решение, в моем 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; } }; }после кода, который изменит БД, добавьте
getContentResolver().notifyChange( Uri.parse("content://same_with_first_string"), null);
Comments