22

1:n の関係を持つ 2 つのテーブルがあり、コンテンツ プロバイダーとカーソルローダーを使用しています。

カーソルローダーで動作するように結合クエリを作成するにはどうすればよいですか? コンテンツ プロバイダー内で rawSql を使用して何らかの方法でハックすることはできますが、カーソル ローダー コンストラクターでそれを行う方法は私には理解できません。

どうもありがとう !

CursorLoader(コンテキスト コンテキスト、Uri uri、String[] プロジェクション、文字列選択、String[] selectionArgs、文字列 sortOrder)

Uri が 1 つのテーブルのみを指すことができる場合、結合を照会する方法

4

2 に答える 2

31

Uriどのテーブルも指していません。それはあなたがそれを指し示したいと思うものを指します。

Customer2 つのテーブルがと であるとしましょうOrder。1 人の顧客が多くの注文をする場合があります。クエリを実行してすべての未処理の注文を取得したいのですが、顧客の名前など、必要になるいくつかの顧客関連の列に結合したいと考えています。

さらに、これらのテーブルを純粋にクエリするように既に定義されているcontent://your.authority.goes.here/customerと仮定しましょう。content://your.authority.goes.here/order

次の 2 つの選択肢があります。

  1. に顧客の表示名の結合を追加します/order Uri。別の使用可能な列を用意しても、おそらくプロバイダーの既存のコンシューマーが壊れることはありません (ただし、テストは常に良い考えです)。これはContactsContract、すべてのテーブルのほぼすべてのクエリで、連絡先の名前などのいくつかの基本列に結合することです。

  2. content://your.authority.goes.here/orderWithCustと同じ基本的なクエリを実行します/orderが、結合が含まれている作成します。この場合、 、 、および何らかの種類の をスローしてinsert()、を使用してデータを変更してはならないことを思い出させることができます。update()delete()RuntimeException/orderWithCustUri

結局、ContentProvider Uriシステムの設計は、REST Web サービスの URL システムの設計に似ています。どちらの場合も、結合はプロバイダー/サーバー側で行う必要があるため、便利な結合を提供するために、1 つのテーブルから 1 つの URL へのベースラインを破る必要がある場合があります。

于 2012-12-30T12:53:34.530 に答える