Intereting Posts
Android In App Billing SecurityException «Включение связующего звена в неправильный интерфейс» Панель инструментов прозрачной панели Android Переопределение кнопки «Главная» – как мне избавиться от выбора? WebViewClient не вызывает shouldOverrideUrlLoading Android Не разрешено загружать локальный ресурс: file: /// android_asset Как прокрутить ListView до конца? Как выбрать элемент ListView после длительного клика? Android: временно отключить изменения ориентации в действии Видимость панели обнаружения / TYPE_SYSTEM_OVERLAY не изменяется автоматически Как проверить неограниченный доступ в Интернет? (Обнаружение портативного портала) Некоторые сторонние виджеты перестают обновляться после обновления приложения. Как обновить просмотр Youtube Player в onItemClickListener () в ListView Как поместить элементы списка в нижней части списка в навигационном ящике, таком как Foursquare Как узнать, видно ли приложение для Android? Попытка добавить фрагмент в мой контейнер-фрагмент FrameLayout

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