Я пытаюсь выяснить, как запросить поставщика содержимого контактов 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);
}
Есть ли способ сделать это или есть альтернативный способ, который даст тот же результат? Результат:
- Учитывая список телефонных номеров, выберите все контакты, у которых есть телефонный номер в списке
Какие-либо предложения?