11

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

私はCursorLoaderシステムを使用して集計データをListViewに取り込みたいと考えています。 これは1台のローダーで可能ですか、複数のローダーを使用する必要がありますか?私は1つを使用することをお勧めします。

私は2つのContentProviderをどのように相互に作用させることができないのかよく分かりません。

答えて

12

カスタムローダークラスを作成する必要があります。

呼び出し活性または断片 onCreate()方法で
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; 
    } 
} 

、カスタムローダークラスを呼び出す必要があります:たとえば

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) { 
    } 
} 
+0

申し訳ありませんを見てみたいかもしれませんが、 "複数のContentProviders"は "私のアプリのdbの複数のテーブル"と同じではありません。 ContentProvidersは異なるアプリからのものかもしれません。その場合、あなたのソリューションは解決策ではありません。 (Necroposting、しかし誰かがヒントを持っているかもしれない) – Giszmo

0

私はContentLoadersの新機能ですが、ContentLoaderを使用して複数のContentProviderを処理する方法はまだ見ていません。

クエリしているテーブルは別のデータベースにありますか?あなたの質問からは分かりません。テーブルがすべて同じデータベース内にある場合は、別のテーブルに1つのContentProviderを代わりに使用することもできます。データを結合して1つのカーソルに戻すことができます。つまり、1つのCursorLoaderを使用できます。

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

メソッドは、この上でいくつかの情報を持っている()SQLiteQueryBuilder.setTables
関連する問題