12

連絡先をグループに多対多でマッピングしようとしています。

たとえば、私が持っている場合:

  • ユーザー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つのクエリで取得する方法を教えてもらえますか?

ありがとう!

4

3 に答える 3

14
    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を取得します。contact_idgroup_id

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

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

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

于 2012-12-31T07:23:07.927 に答える
2

完全な答えは次のようになります。最初にグループカーソルをフェッチします(上記の答えと同じ)

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

次のコードを使用して、すべてのgroup_idとgroup_titleをグループHashMapに格納します。

 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);
        }
    }

次に、上記の回答の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 );
           }
  }
于 2015-08-27T11:01:24.057 に答える
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;
}
于 2017-06-13T12:10:46.660 に答える