CursorLoader для нескольких контент-провайдеров - PullRequest
11 голосов
/ 08 декабря 2011

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

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

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

Ответы [ 3 ]

12 голосов
/ 11 апреля 2012

Вам нужно будет написать класс 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) {   
    }
}
1 голос
/ 13 ноября 2014

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

0 голосов
/ 13 января 2012

Я новичок в 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

...