我试图弄清楚如何使用电话号码列表查询 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);
}
有没有办法做到这一点,或者是否有另一种方法可以产生相同的结果?结果是:
- 给定电话号码列表,选择列表中具有电话号码的所有联系人
有什么建议么?