Как я могу объединить записи с другим CONTENT_ITEM_TYPE, но с общим полем, а именно RAW_CONTACT_ID? - PullRequest
0 голосов
/ 15 июня 2019

Мне нужно Cursor для выбора контактов, принадлежащих к определенным группам, упорядоченным по фамилиям (не по имени для отображения).

Легко получить курсор, возвращающий контакты, принадлежащие запрошенным группам, а другой - контакты, отсортированные по фамилиям. Однако фамилия относится к записям DATA с ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, а контакты, принадлежащие к определенным группам, можно найти в записях с ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE.

Как я могу объединить записи с другим CONTENT_ITEM_TYPE, но которые имеют общее поле, а именно RAW_CONTACT_ID?

1 Ответ

0 голосов
/ 24 июня 2019

Вы сказали, что вам нужно выбрать контакты, если вы не используете RAW_CONTACT_ID, а вместо этого CONTACT_ID, чтобы присоединиться к данным ваших контактов.Один контакт может быть совокупностью нескольких RawContacts, и в этом случае я предполагаю, что вы хотите, чтобы все детали этих отдельных контактов были в одной строке.

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

Кстати, если вы предпочитаете делать запросы по таблицам Contacts / RawContacts вместо таблицы Data,Вы можете использовать столбец DISPLAY_NAME_ALTERNATIVE, чтобы получить сортировку, см. https://developer.android.com/reference/android/provider/ContactsContract.ContactNameColumns.html#DISPLAY_NAME_ALTERNATIVE

Пример кода:

int selectedGroupId = 12345;
HashSet<Long> ids = new HashSet<>();

// get all CONTACT_IDs belonging to some GROUP_ID
String[] projection = new String[]{Data.CONTACT_ID};
String selection = Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE + "' AND " + GroupMembership.GROUP_ROW_ID + "=" + selectedGroupId;
Cursor c = getContentResolver().query(Data.CONTENT_URI, projection, selection, null, null);
while (c.moveToNext()) {
    ids.add(c.getLong(0));
}
c.close();

String[] projection = new String[]{Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1};
// you can add more MIMETYPES to the selection here to get phones, emails, etc. for each contact
String selection = Data.CONTACT_ID + " IN (" + TextUtils.join(",", ids) + ") AND " + Data.MIMETYPE + "='" + StructuredName.CONTENT_ITEM_TYPE + "'";
c = getContentResolver().query(Data.CONTENT_URI, projection, selection, null, StructuredName.FAMILY_NAME + " ASC");
DatabaseUtils.dumpCursor(c);
c.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...