21

Androidで次のクエリ(擬似コード)を実行しようとしています。

SELECT C.ID, C.NAME, CASE ISNULL(G.GROUPID,0) = 0 THEN 0 ELSE 1 END INGROUP
FROM CONTACTS C 
LEFT JOIN GROUPMEMBERSHIP G ON G.CONTACTID = C.ID AND G.GROUPID = ?

連絡先がグループのメンバーであるかどうかを示す0/1フィールドとともに、デフォルトの連絡先ContentProviderを介して、システムアドレスブック内のすべての連絡先のIDと名前を選択しようとしています?

もちろん、すべての連絡先を簡単に取得してから、Adapterクラスでメンバーシップを個別にループしてクエリするのは簡単ですが、1つの外部結合クエリとして2つのクエリを実行すると、パフォーマンスが大幅に向上すると思います。

標準の高レベルの文字列投影とContentResolver.query()メソッドでこれを行うことはできますか?または、この種のクエリでは、より直接的なSQL実行を掘り下げる必要がありますか?

4

3 に答える 3

42

編集: わかりました。質問で述べたように、eidylon は既存の ContentProvider に関連付けられているため、これは実際には質問を解決しません。ただし、ContentProvider ソースと API を所有している場合に JOIN を実行する方法については説明します。そのため、そのケースの処理方法を知りたい人のために残します。


かんたんだよ!しかし、直感的ではありません... :)

query(Uri uri, String[] projection, String selection, 
String[] selectionArgs, String sortOrder)

さて、URIとは何ですか?通常、テーブルごとに 1 つの URI があります。

content://com.example.coolapp.contactsテーブルからデータを提供しますCONTACTScontent://com.example.coolapp.groupmembersテーブルからデータを提供しますGROUPMEMBERSHIP

しかし、URI は実際には単なる文字列です。好きなように使用してください。に応答する ContentProvider でコードのブロックを作成しますcontent://com.example.coolapp.contacts_in_group。ContentProvider のそのコード ブロック内で、制限されたquery()データ モデルに縛られることなく、SQLite DB への raw アクセスを取得できます。お気軽にご利用ください!

選択フィールドは自由に定義してください。テーブルの列名にマップする必要はありません。パラメーターを取得するために、必要な方法でマップします

必要に応じてプロジェクションを定義します。結合後に両方のテーブルの列が含まれる場合があります。

ビング、完了です。Google はこれと同じモデルを独自のコードで内部的に実行しています。連絡先プロバイダー API を見てください。「bla.RawContact」や「bla.Contact」などのコンテンツ URI が表示されます。それぞれが DB 内の同じテーブルからデータを提供します。異なる URI は、同じテーブルの異なるビューを提供するだけです!

于 2011-07-01T13:41:01.690 に答える
8

いいえ、メソッドでそのようなクエリを実行することはできませんContentResolver.query()。次のように書く必要があります。

SQLiteDatabase db = YourActivity.getDbHelper().getReadableDatabase();
String query = yourLongQuery;
Cursor c = db.rawQuery(query, null);
YourActivity.startManagingCursor(c);
c.setNotificationUri(YourActivity.getContentResolver(), YourContentProvider.CONTENT_URI);
于 2011-06-27T13:08:43.727 に答える
0

ContentResolver にはクエリ メソッドが 1 つしかないため、これを行うことはできません。

    query(Uri uri, String[] projection, String selection, 
String[] selectionArgs, String sortOrder)

テーブルまたは FROM 句のパラメーターはありません。

于 2011-06-30T09:08:26.197 に答える