Intereting Posts
Android: ProgressDialog не показывает Чат для Android с использованием XMPP-сервера и облачных сообщений Google (или более новых Firebase Cloud Messaging) для Push-уведомлений Получить GPS-местоположение в широковещательном приемнике / или услуге для передачи данных приемника Broadcast Как установить заголовок для счетчика, который нельзя выбрать ..? Как я могу заставить JHC сотрудничать с android ndk? Разница между объявлениями Admob и объявлениями Firebase Android import ressources из проекта библиотеки Основы Android Fragments: почему? Является ли это концептуально неправильным? Ошибка выравнивания текста при использовании арабского шрифта Получение допустимого указателя JNIEnv Привязка данных Android (аналогично WPF)? Обрезать изображение при выборе из галереи в андроиде Genymotion не запускает виртуальное устройство Android Настройки Android: как загрузить значения по умолчанию, когда пользователь не использовал экран настроек? Приложение не доступно для Nexus 7 в Google Play

CursorLoader для нескольких ContentProviders

Мне нужно сделать ListAdapter, который представляет данные из нескольких ContentProviders. Сами ContentProviders представляют одну таблицу из реляционной базы данных.

Я хочу использовать систему CursorLoader для извлечения агрегированных данных в ListView. Возможно ли это сделать с 1 загрузчиком или мне нужно использовать несколько загрузчиков? Я бы предпочел использовать его.

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

Solutions Collecting From Web of "CursorLoader для нескольких ContentProviders"

Вам нужно будет написать класс Custom Loader. Например:

public class FooLoader extends AsyncTaskLoader { Context context; public FooLoader(Context context) { super(context); this.context = context; } @Override public Cursor loadInBackground() { Log.d(TAG, "loadInBackground"); YourDatabase dbHelper = new YourDataBase(context); SQLiteDatabase db= dbHelper.getReadableDatabase(); /*** create a custom cursor whether it is join of multiple tables or complex query**/ Cursor cursor = db.query(<TableName>, null,null, null, null, null, null, null); return cursor; } } 

В вызове или фрагменте onCreate() вам нужно вызвать пользовательский класс загрузчика:

 public class MyFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate():" + mContent); Loader loader = getLoaderManager().initLoader(0, null, this); loader.forceLoad(); } @Override public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { Log.d(TAG, "onCreateLoader()") ; return new FooLoader(getActivity()); } @Override public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { Log.d(TAG, "onLoadFinished"); } @Override public void onLoaderReset(Loader<Cursor> cursorLoader) { } } 

Вы можете взглянуть на CursorJoiner.

Я новичок в ContentLoaders сам, но я еще не видел способа, которым вы могли бы использовать один ContentLoader для обработки нескольких ContentProviders.

Будут ли таблицы, которые вы запрашиваете в разных базах данных? Это непонятно из вашего вопроса. Если все таблицы находятся в одной и той же базе данных, одной альтернативой может быть использование одного ContentProvider для отдельных таблиц. Данные могут быть объединены и возвращены одному курсору, что означает, что вы можете использовать один CursorLoader. Метод SQLiteQueryBuilder.setTables () содержит некоторую информацию об этом:

http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html#setTables%28java.lang.String%29

И вы можете увидеть это в действии здесь:

http://code.google.com/p/openintents/source/browse/trunk/shoppinglist/ShoppingList/src/org/openintents/shopping/provider/ShoppingProvider.java

Это также может быть полезно: https://stackoverflow.com/a/3196484/399105