2012-12-31 13 views
10

私は連絡先をグループに多対多でマッピングしようとしています。例えば連絡先のグループを取得しますか?

、Iている場合:

  • ユーザ1、グループ701、702、704
  • ユーザ2に属し、無グループに属する
  • ユーザ3が、グループ702
  • に属し

私はこのようになります関係取得するために願っています:

userID | groupID 
1  | 701 
1  | 702 
1  | 704 
3  | 702 

私はこれを試しました:

Cursor cursor = contentResolver.query(ContactsContract.Data.CONTENT_URI, null, new String[] { 
    ContactsContract.CommonDataKinds.GroupMembership.CONTACT_ID, 
    ContactsContract.CommonDataKinds.GroupMembership.GROUP_SOURCE_ID 
}, null, null, null); 

しかしこれはうまくいきません。 GROUP_SOURCE_ID列は、どのグループのIDでもない奇妙な数字を返します。場合によっては、0または負の数も返します。

私は、各グループを通過し、そのグループ内のすべての連絡先を見つけることによってこれのマッピングを構築することができますが、それは多くのクエリを取るでしょう、そして、私は速く(明らかに、かなり遅い!)。

誰もこの連絡先とグループのマッピングを1つのクエリでどのように取得できるか教えてください。

ありがとうございます!連絡先データベース内のすべての連絡先のcontact_idgroup_idを取得しますdataCursorこれを使用することにより

答えて

11
Cursor dataCursor = getContentResolver().query(
      ContactsContract.Data.CONTENT_URI, 
      new String[]{ 
        ContactsContract.Data.CONTACT_ID, 
        ContactsContract.Data.DATA1 
      }, 
      ContactsContract.Data.MIMETYPE + "=?", 
      new String[]{ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE}, null 
    ); 

。連絡先データベース内のすべてのグループのgroup_idgroup_titleを取得しますgroupCursorこれを使用することにより

Cursor groupCursor = getContentResolver().query(
      ContactsContract.Groups.CONTENT_URI, 
      new String[]{ 
        ContactsContract.Groups._ID, 
        ContactsContract.Groups.TITLE 
      }, null, null, null 
    ); 

contact_idに関連付けられているすべてのグループを最初に取得する場合は、適切なselect文を使用してdataCursorを取得します。 dataCursorを使用すると、そのすべてにgroup_idが関連付けられます。contact_idgroupCursorを使用すると、その特定の連絡先に関連付けられているすべてのグループに関する情報を取得できます。

+0

!どうもありがとうございます! DATA1が必要なことをどうやって知ったのですか?解決策を教えてくれるドキュメントがありますか?私は長い時間を探して、何も見つけられなかったので... – Verdagon

+0

@Verdagon連絡先データベースを調べることによって –

+0

これは初心者ができるはずのものですか?そうでない場合は、どうすればいいのか教えてください。記事を書くことができますか? – Verdagon

2

完全な答えは次のようになります

if(groups_cursor!=null){ 
     while(groups_cursor.moveToNext()){ 
      String group_title = groups_cursor.getString(1); 
      String id = groups_cursor.getString(0); 
      groups.put(id, group_title); 
     } 
    } 
: 最初にこのコードを使用してHashMapのグループのグループ(上記の回答と同じ)カーソル

Cursor groups_cursor= getContentResolver().query(
     ContactsContract.Groups.CONTENT_URI, 
     new String[]{ 
       ContactsContract.Groups._ID, 
       ContactsContract.Groups.TITLE 
     }, null, null, null 
); 

店GROUP_IDとgroup_titleフェッチ

上記の答えのdata_cursorを使用して、contacts_idsとそのgroup_idsを取得します。

Cursor dataCursor = getContentResolver().query(
     ContactsContract.Data.CONTENT_URI, 
     new String[]{ 
       ContactsContract.Data.CONTACT_ID, 
       ContactsContract.Data.DATA1 
     }, 
     ContactsContract.Data.MIMETYPE + "=?", 
     new String[]{ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE}, null 
); 

ここでdataCursorとHashMapグループを使用します。美しく働い

if(dataCursor!=null){ 
      while(dataCursor.moveToNext()){ 
       String id = dataCursor.getString(0); 
       String group_id= dataCursor.getString(1); 
       String groupTitle = groups.get(group_id); 
       Log.d(TAG, "groupTitle : " + groupTitle + " contact_id: " + id); 
      } 
    } 
0
public static HashMap<String, String> getContactsForGroup(String groupID, Activity activity){ 
    Cursor dataCursor = activity.getContentResolver().query(
      ContactsContract.Data.CONTENT_URI, 
      new String[]{              // PROJECTION 
        ContactsContract.Data.CONTACT_ID, 
        ContactsContract.Data.DISPLAY_NAME,   // contact name 
        ContactsContract.Data.DATA1     // group 
      }, 
      ContactsContract.Data.MIMETYPE + " = ? " + "AND " +     // SELECTION 
      ContactsContract.Data.DATA1 + " = ? ",   // set groupID 
      new String[]{              // SELECTION_ARGS 
        ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE, 
        groupID 
      }, 
      null 
    ); 

    dataCursor.moveToFirst(); 
    HashMap<String, String> map = new HashMap<>(); 
    while (dataCursor.moveToNext()) // 
    { 
     String s0 = dataCursor.getString(0);    //contact_id 
     String s1 = dataCursor.getString(1);    //contact_name 
     String s2 = dataCursor.getString(2);    //group_id 
     Log.d("tag", "contact_id: " + s0 + " contact: " + s1 + " groupID: "+ s2); 
     map.put(s0, s1); 
    } 
    return map; 
} 
+0

いくつかの提案...あなたの 'while'ループを' do while'ループに変更してください。コードは今書かれているので、 'cursor.moveToFirst()'はポインタをインデックス0に置くが、 'while(cursor.moveToNext())'はインデックス1に進むので、常にテーブルの最初の行をスキップする。カーソルを 'close()'しなければなりません(try finallyブロックで)。最後に 'dataCursor.moveToFirst()'は理論的にはNPEを投げることができるので、ヌルチェックを追加してください。 – k2col

関連する問題