3

我试图弄清楚如何使用电话号码列表查询 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);
}

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

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

有什么建议么?

4

1 回答 1

4

首先,我认为没有办法在ContactsContract.PhoneLookup.

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

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

于 2012-08-20T21:08:41.883 回答