CursorLoader для нескольких контент-провайдеров
Мне нужно сделать ListAdapter, который представляет данные из нескольких ContentProviders. Сами ContentProviders представляют одну таблицу из реляционной базы данных.
Я хочу использовать систему CursorLoader для извлечения совокупных данных в ListView. Можно ли это сделать с 1 загрузчиком или мне нужно использовать несколько загрузчиков? Я бы предпочел использовать один.
Я не уверен, как можно заставить 2 ContentProvider взаимодействовать друг с другом, кроме ручного соединения в коде, что тоже не кажется хорошим вариантом.
3 ответа
Вам нужно будет написать класс 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) {
}
}
Я новичок в ContentLoaders сам, но я еще не видел, как вы могли бы использовать один ContentLoader для обработки нескольких ContentProviders.
Таблицы, к которым вы обращаетесь, находятся в разных базах данных? Это не ясно из вашего вопроса. Если все таблицы находятся в одной базе данных, одной из альтернатив может быть использование одного ContentProvider для отдельных таблиц. Данные могут быть объединены и возвращены к одному курсору, что означает, что вы можете использовать один CursorLoader. Метод SQLiteQueryBuilder.setTables() содержит следующую информацию:
http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html
и вы можете увидеть это в действии здесь:
это также может быть полезно: /questions/9941281/baza-dannyih-android-contentprovider-zaprashivaet-neskolko-tablits/9941291#9941291