Получить контактные группы?

Я пытаюсь сделать сопоставление контактов для групп "много-ко-многим".

Например, если у меня есть:

  • Пользователь 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 возвращает странные числа, которые не являются идентификаторами любых групп. Иногда он даже возвращает 0 или отрицательное число.

Я мог бы построить это отображение, пройдя через каждую группу и найдя все контакты в этой группе, но это потребует много запросов, и я стараюсь оставаться на месте (по-видимому, просто эти несколько запросов медленно!).

Может ли кто-нибудь сказать мне, как я могу получить это сопоставление контактов между группами в одном запросе?

Спасибо!

Ответ 1

    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_id и group_id всех контактов в базе данных контактов.

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

Используя этот groupCursor, вы получите group_id и group_title всех групп в базе данных контактов.

Итак, если вы хотите получить все группы, связанные с contact_id, сначала получите dataCursor с помощью подходящих операторов выбора. Используя dataCursor, вы можете получить все group_id, связанные с этим contact_id. Теперь, используя groupCursor, вы можете получить информацию обо всех группах, связанных с этим конкретным контактом.

Ответ 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 );
           }
  }

Ответ 3

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