android-CursorLoader & SQLite без контент-провайдера



Я знаю, что это обсуждалось, но я хотел спросить о текущем состоянии вопроса. Должен ли я создать ContentProvider для использования CursorLoader в связи с базой данных sqlite?



нашел



использование CursorLoader без ContentProvider



выглядит именно то, что я надеялся еще, как прокомментировал Эмби




  • пользователи должны знать об одном ограничении, которое заключается в том, что у него нет механизма обновления при изменении данных (как Погрузчики должны делать)


поэтому упоминается другое решение



https://github.com/commonsguy/cwac-loaderex



еще раз указывается на некоторый недостаток




  • однако, чтобы использовать автоматический повторный запрос, вам нужно использовать один и тот же загрузчик для пользовательского интерфейса, а также для обновлений, ограничивая его удобство для фоновых служб.


конечно при использовании LoaderManager мы хотим получить все преимущества, ради которых он был введен. Поэтому мой вопрос заключается в том, есть ли способ использовать LoaderManager в связи с базой данных sqlite без необходимости реализации контент-провайдера, но все же имеет все преимущества.



спасибо

649   2  

2 ответов:

две реализации, которые вы упоминаете в своем посте, предлагают все преимущества CursorLoaderкроме возможность получать уведомления при изменении содержания.

Я изучал это много в последнее время, и я могу с уверенностью сказать вам, что Android API в настоящее время не предоставляет средства для этого только с raw SQLiteDatabase (Он предоставляет только ContentResolver#notifyChange() и Cursor#setNotificationUri() методы, которые используются для уведомления всех Cursors зарегистрирован под определенным уведомлением Uri).

тем не менее, ваши варианты прямо сейчас:

  1. реализовать наблюдатель самостоятельно, который способен получать уведомления от SQLiteDatabase когда содержимое изменяется, и каким-то образом может передавать эти уведомления всем существующим Loaderв вашем приложении. Я написал довольно обширный блоге о том, как реализовать Loaders, что может пригодиться, если вы хотите взять на себя эту задачу. Или...

  2. используйте Марк Мерфи LoaderEx библиотека и только вносить изменения в базу данных с помощью AsyncTask операции его библиотеки. Обратите внимание, что причина, по которой его задачи обновляют Loader - это потому, что они называют onContentChanged на Loader сразу после вставки / обновления / удаления выполняется, эффективно сообщая Loader, что содержание изменилось и что он должен обновить свои данные.

  3. просто использовать а 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

    Ничего не найдено.