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

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

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

  • Пользователь 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 или отрицательное число.

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

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

Благодаря!

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

Полный ответ будет следующим: сначала выберите групповой курсор (то же, что и ответ выше)

 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); } } в  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 ); } } в  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 ); } } 
  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; } 
Intereting Posts
Объявление атрибутов стиля в Android Широковещательный приемник для проверки подключения к Интернету в приложении Android Последний день DatePickerDialog не выбирается после установки максимальной даты Программно настроить анимацию для ViewSwitcher Распознавание активности Android с прослушивателем или широковещательным приемником? Android Studio 2.0 – пауза / белый экран при первом запуске приложения Android: лучший подход для передачи данных между фрагментами зрителя Значение { *; } В ProGuard Какова наилучшая практика для разблокировки функций приложения для пользователя на Android? Наложение макета на ListItem на основе определенной переменной ListItem Android twitter4j – как обмениваться удаленным изображением? Как отличить видеовстречу от приложения Google Talk? AltBeacon onBeaconServiceConnect не называется Как уменьшить / размыть только часть экрана? Можем ли мы ограничить количество символов в редакторе SearchView в Android?