Android联系人查询消除重复

时间:2018-05-09 19:01:06

标签: android android-sqlite android-contacts

我有一个非常具体的问题,即通过我对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");

我有一个免费的表单搜索查询,我希望部分匹配显示名称,电话或电子邮件。这很简单,效果非常好,实际上非常快(足够快,可以在用户输入数千个联系人时实时突出显示更改结果)。

除了无法消除重复之外,一切都很好。当用户在其设备上有多个帐户导致汇总的联系人时,当用户在其添加的帐户中具有相同的联系信息时,结果将在该查询的结果中多次具有该电话号码或电子邮件。

我不想发布光标处理(没有迭代光标并在内存中创建列表,将数据同步到我自己的数据库等等。)。

是否有执行此查询的唯一区别是结果将仅限于具有不同电话或电子邮件的记录?

1 个答案:

答案 0 :(得分:0)

AFAIK ContentResolver API不支持此功能,特别是ContactsContract不支持。 您可能想重新考虑后处理选项。

相关问题