11

複数のContentProviderからのデータを表示するListAdapterを作成する必要があります。ContentProvider自体は、リレーショナルデータベースからそれぞれ1つのテーブルを表します。

CursorLoaderシステムを使用して、集合データをListViewに取得したいと思います。これは1つのローダーで行うことができますか、それとも複数のローダーを使用する必要がありますか?使いたいです。

コードで手動で結合を行う以外に、2つのContentProviderを相互に対話させる方法がわかりませんが、これも優れたオプションとは思えません。

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を初めて使用しますが、1つのContentLoaderを使用して複数のContentProviderを処理する方法はまだ見ていません。

クエリしているテーブルは別のデータベースにありますか?あなたの質問からは明らかではありません。テーブルがすべて同じデータベースにある場合、1つの代替方法は、代わりに1つのContentProviderを個別のテーブルに使用することです。データを結合して1つのカーソルに戻すことができます。つまり、1つの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 に答える