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

Кажется, рекомендуемый Google способ (с использованием библиотеки поддержки Android) для фрагмента или действия для взаимодействия с базой данных sqlite - через загрузчик, который расширяет AsyncTaskLoader и работает аналогично тому, как CursorLoader работает для ContentProviders.

Одно действие или фрагмент могут взаимодействовать с базой данных различными способами, обновляя, удаляя и запрашивая данные в одной или нескольких таблицах. Но поскольку у загрузчика есть только одно место для выполнения манипуляций с базой данных (т.е. в loadInBackground()), ожидается ли, что разработчик напишет отдельный загрузчик для каждого типа взаимодействия, тем более, что кажется, что единственный способ параметризовать поведение в loadInBackground() это путем передачи аргументов конструктору загрузчика через аргумент args в LoaderManager.initLoader()?

Спасибо большое.


person Julian A.    schedule 11.01.2012    source источник
comment
хороший вопрос. Я тоже считаю, что на один запрос должен быть один загрузчик.   -  person Malachiasz    schedule 07.11.2013


Ответы (3)


Если не использовать ContentProvider, то есть при непосредственном использовании sqlite, используйте AsyncTaskLoader, если набор операций с базой данных, которые необходимо выполнить, возвращает Cursor. В набор могут входить любые операции - обновление, запрос, удаление, вставка. Эти операции должны выполняться в AsyncTaskLoader.loadInBackground().

Если набор операций с базой данных не приводит к возвращению Cursor, используйте AsyncTask. В этом случае операции должны выполняться в AsyncTask.doInBackground().

person Julian A.    schedule 27.01.2012

Есть два ключевых преимущества использования CursorLoader в вашем приложении по сравнению с Activity.managedQuery():.

  1. Запрос обрабатывается для вас в фоновом потоке (благодаря тому, что он построен на AsyncTaskLoader), поэтому большие запросы данных не блокируют пользовательский интерфейс. Это то, что документация рекомендовала вам сделать для себя при использовании простого Cursor, но теперь это делается под капотом .
  2. CursorLoader обновляется автоматически. В дополнение к выполнению исходного запроса CursorLoader регистрирует ContentObserver с запрошенным вами набором данных и вызывает forceLoad() при изменении набора данных. Это приводит к тому, что вы получаете async обратных вызовов каждый раз, когда данные изменяются, чтобы обновить представление.

Каждый экземпляр загрузчика также обрабатывается с помощью единственного числа LoaderManager, так что вам по-прежнему не нужно напрямую управлять курсором, и теперь соединение может сохраняться даже за пределами одного Activity. LoaderManager.initLoader() и LoaderManager.restartLoader(), что позволяет вам повторно подключаться к существующему загрузчику, уже настроенному для вашего запрашивать и, в некоторых случаях, мгновенно получать самые свежие данные, если они доступны.

Ваша активность или фрагмент, скорее всего, теперь будут реализовывать интерфейс LoaderManager.Callback. Вызов initLoader() приведет к вызову метода onCreateLoader(), в котором вы создадите запрос и, при необходимости, новый экземпляр CursorLoader. Метод onLoadFinished() будет запускаться каждый раз, когда будут доступны новые данные, и будет включать последний курсор, который вы можете прикрепить к представлению или иным образом выполнить итерацию.

Кроме того, на странице документации класса LoaderManager есть довольно хороший пример того, как все это сочетается: http://developer.android.com/reference/android/app/LoaderManager.html

Надеюсь, это поможет!

person Community    schedule 11.01.2012
comment
Спасибо за ваш ответ. Однако я не спрашивал, как использовать CursorLoader или в чем преимущества выполнения операций с базой данных в потоке, отличном от пользовательского интерфейса. - person Julian A.; 11.01.2012

Основываясь на предыдущих ответах, я не уверен, что это именно то, о чем вы спрашиваете. Но ДА, вы должны создать загрузчик с уникальным идентификатором для каждого набора данных, то есть для каждого типа выполняемого вами запроса.

person Alécio Carvalho    schedule 13.06.2012