У меня есть очень специфический вопрос об устранении дубликатов из-за агрегированных контактов из различных добавленных учетных записей на устройстве с моим запросом к ContactsContract.Data
//
// (Mimetype == Phone OR Mimetype == Email)
// AND
// (
// DisplayName LIKE searchQuery
// OR
// (Mimetype == Phone AND NormalizedPhone LIKE phoneNormalizedSearchQuery)
// OR
// (Mimetype == Email AND Email LIKE searchQuery)
// )
//
String selection = ""
+ "(" + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'" + " OR " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE + "')"
+ " AND "
+ "("
+ ContactsContract.Data.DISPLAY_NAME + " LIKE '%" + searchQuery + "%'"
+ " OR "
+ "(" + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'" + " AND " + ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER + " LIKE '%" + phoneNormalizedSearchQuery + "%'" + ")"
+ " OR "
+ "(" + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE + "'" + " AND " + ContactsContract.CommonDataKinds.Email.ADDRESS + " LIKE '%" + searchQuery + "%'" + ")"
+ ")";
Uri uri = ContactsContract.Data.CONTENT_URI.buildUpon()
.appendQueryParameter(ContactsContract.CommonDataKinds.Contactables.VISIBLE_CONTACTS_ONLY, "true")
.build();
return new CursorLoader(context, uri, CONTACTS_PROJECTION, selection, null, ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
У меня есть поисковый запрос свободной формы, который я хочу частично сопоставить с отображаемым именем, телефоном или электронной почтой. Это достаточно просто, работает очень хорошо и на самом деле очень быстро (достаточно быстро, чтобы подсвечивать изменяющиеся результаты в реальном времени, когда пользователь печатает даже с несколькими тысячами контактов).
Все отлично, кроме невозможности устранения дубликатов. Когда у пользователя есть несколько учетных записей на своем устройстве, что приводит к объединенным контактам, в результате этого запроса этот телефонный номер или адрес электронной почты будут несколько раз, когда пользователь имеет одинаковые контактные данные в своих добавленных учетных записях.
Я не хочу публиковать обработку курсора (без перебора курсора и создания списка в памяти, синхронизации данных в моей собственной БД и т. Д.).
Есть ли какой-либо способ выполнить этот запрос, с той лишь разницей, что результат будет ограничен записями с отдельным телефоном или электронной почтой?