11

我需要制作一个 ListAdapter 来呈现来自多个 ContentProvider 的数据。ContentProviders 本身代表关系数据库中的一个表。

我想使用 CursorLoader 系统将聚合数据检索到 ListView 中。这可能与 1 个装载机有关还是我需要使用多个装载机?我宁愿用一个。

我不确定如何让 2 个 ContentProviders 相互交互,而不是在代码中手动进行连接,这似乎也不是一个很好的选择。

4

3 回答 3

12

您将不得不编写一个自定义加载器类。例如:

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) {   
    }
}
于 2012-04-11T06:55:45.110 回答
1

您可能想看看CursorJoiner。

于 2014-11-13T09:21:03.243 回答
0

我自己是 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

于 2012-01-12T22:42:17.757 回答