Невозможно выбрать все контакты с телефонными номерами, соответствующими предложению 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);
}

Есть ли способ сделать это или есть альтернативный способ, который даст тот же результат? Результат:

  • Учитывая список телефонных номеров, выберите все контакты, у которых есть телефонный номер в списке

Какие-либо предложения?


person user1080691    schedule 20.06.2012    source источник


Ответы (1)


Во-первых, я не думаю, что есть способ добавить несколько телефонных номеров в ContactsContract.PhoneLookup.

Во-вторых, как вы сказали, числа, хранящиеся в ContactsContract.CommonDataKinds.Phone, обычно форматируются. Способ определения равенства двух телефонных номеров основан на PhoneNumberUtils.compare(String num1, String num2). Прочитав исходный код здесь возможно, вам придет в голову идея, как сгенерировать список вариантов числа и включить их всех в IN ('num1', 'num2', ...)

Если у вас есть много номеров для поиска (то есть почти столько же, сколько весь размер контакта), я предлагаю запросить все ЧИСЛА и данные, которые вы хотите, из ContactsContract.CommonDataKinds.Phone и сохранить их в HashMap<NumberString, TheDataYouWant>. (Перед этим вам нужно создать класс NumberString, который содержит строку, и переопределить метод compareTo(), чтобы он возвращал PhoneNumberUtils.compare(this.string, anotherNumber.string);). Затем вы можете искать нужные числа в HashMap.

person xiangxin    schedule 20.08.2012