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

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

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

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

Ответы [ 3 ]

2 голосов
/ 27 января 2012

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

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

1 голос
/ 13 июня 2012

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

1 голос
/ 11 января 2012

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

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

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

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

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

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

...