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

StackOverflow https://stackoverflow.com/questions/8814674

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top