无法选择电话号码与 IN 子句匹配的所有联系人



我正在尝试弄清楚如何使用电话号码列表查询Android联系人内容提供商,以检索电话号码与该列表中的项目匹配的联系人。在直接SQL中,我会使用类似的东西:

SELECT * FROM PHONES WHERE NUMBER IN ('1234','1235')

不能,因为我正在使用 CP API,而且我似乎错过了一些东西。这是onCreateLoader()查询的一个片段。此查询的结果中没有返回任何记录,但我知道数据库中的联系人存在这些电话号码。我认为找不到任何记录,因为存储在数据库中的电话号码的格式如下:

+1 425-555-1212

我不知道是否有办法查询 CP 并让它根据未格式化的数据评估我的IN()查询列表。下面是onCreateLoader()查询:

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = new String[] {    
            ContactsContract.CommonDataKinds.Phone._ID,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.LABEL,
            ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY,
            ContactsContract.CommonDataKinds.Phone.NUMBER};
    return new CursorLoader(
            getActivity().getApplicationContext(), 
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            projection,
            ContactsContract.CommonDataKinds.Phone.NUMBER+" IN ('4255551212','4255551213')",
            null,
            null);
}

PhoneLookup(如下所示)与上一个查询中的一个电话号码一起使用实际上会产生正确的联系人匹配,因此我认为一定有一种方法可以做到这一点。不幸的是,PhoneLookup似乎无法处理电话号码列表,而只能处理单个电话号码:

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = new String[] {
            ContactsContract.PhoneLookup._ID,
            ContactsContract.PhoneLookup.DISPLAY_NAME,
            ContactsContract.PhoneLookup.LABEL,
            ContactsContract.PhoneLookup.LOOKUP_KEY,
            ContactsContract.PhoneLookup.NUMBER};
    return new CursorLoader(
            getActivity().getApplicationContext(),
            Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode("4255551212")),
            projection,
            null,
            null,
            null);
}
有没有

办法做到这一点,或者有没有其他方法可以产生相同的结果?结果是:

  • 给定电话号码列表,选择列表中有电话号码的所有联系人

有什么建议吗?

首先,

我认为没有办法在ContactsContract.PhoneLookup中附加多个电话号码。

其次,正如您所说,存储在ContactsContract.CommonDataKinds.Phone中的数字通常是格式化的。它确定两个电话号码是否相等的方式基于 PhoneNumberUtils.compare(String num1, String num2)。通过阅读此处的源代码,也许您会想出一些想法,如何生成一个数字的变体列表并将它们全部包含在IN ('num1', 'num2', ...)

如果您有很多数字要查找(即几乎与整个联系人大小相同),我建议您查询所有 NUMBER 和您想要从ContactsContract.CommonDataKinds.Phone中的数据并将它们存储在HashMap<NumberString, TheDataYouWant>中。(在此之前,您需要创建一个包含字符串的 NumberString 类并重写要返回PhoneNumberUtils.compare(this.string, anotherNumber.string);)compareTo() 方法。然后,您可以在HashMap中搜索所需的号码。

最新更新