Как запросить контакты, у которых есть и номер телефона, и имя?

У меня есть следующий код в API до Android2.0:

    String[] PROJECTION = new String[] { Contacts.People._ID, Contacts.PeopleColumns.NAME, Contacts.Phones.NUMBER };
    Cursor c = mActivity.managedQuery(Contacts.People.CONTENT_URI, PROJECTION, null, null, Contacts.People.DEFAULT_SORT_ORDER);

Какой выбор я должен сделать, чтобы получить контакты, у которых есть и имя, и номер телефона?


person pixel    schedule 12.11.2010    source источник


Ответы (1)


В Android 1.6 и старше:

String[] PROJECTION=new String[] {  Contacts.Phones._ID,
                                    Contacts.Phones.NAME,
                                    Contacts.Phones.NUMBER
                                    };
Cursor c=a.managedQuery(Contacts.Phones.CONTENT_URI, PROJECTION, null, null, null);

В Android 2.0 и новее:

String[] PROJECTION=new String[] {  Contacts._ID,
                                    Contacts.DISPLAY_NAME,
                                    Phone.NUMBER
                                    };
Cursor c=a.managedQuery(Phone.CONTENT_URI, PROJECTION, null, null, null);

Вот пример проекта, демонстрирующий их использование, включая обнаружение и используя правильный API в зависимости от уровня ОС устройства.

person CommonsWare    schedule 12.11.2010
comment
Хорошо, но как получить People._ID в таком запросе? (Этот идентификатор будет использоваться для поиска контактных фотографий) - person pixel; 12.11.2010
comment
@pixel: Ну, я немного небрежен в этом коде (примечание: почистите это). Contacts._ID во втором примере — это _ID контакта, который вам понадобится для краткосрочных запросов. Эквивалентом старшего будет Contacts.Phones.PERSON_ID, я полагаю. - person CommonsWare; 12.11.2010
comment
Спасибо, не заметил этой константы. Еще одна вещь - когда у меня есть контакты с двумя телефонными номерами, я получаю две строки с одинаковым именем и разными телефонами. Вы знаете, как получить один контакт с двумя номерами? - person pixel; 12.11.2010
comment
@pixel: Это невозможно, извините. Вам придется объединить их самостоятельно. - person CommonsWare; 12.11.2010
comment
@CommonsWare С помощью этой техники я не могу видеть синхронизированные контакты (только те, которые были введены вручную). Как я могу включить их в результат? Кроме того, как мне отсортировать числа по имени в порядке возрастания? Ссылаясь на вашу книгу, но не могу получить это. Пожалуйста помоги :-) - person Angad; 20.03.2015
comment
@Angad: с помощью этой техники я не могу увидеть синхронизированные контакты — вам нужно использовать ContactsContract. Этот вопрос возник в конце 2010 года, когда провайдер Contacts был гораздо более актуальным. Кроме того, managedQuery() больше не рекомендуется. Кроме того, как мне отсортировать числа по имени в порядке возрастания? -- вам нужно будет использовать соответствующее предложение порядка в вашем query() (на ContentResolver) или CursorLoader. Ссылаясь на вашу книгу, но не в состоянии получить это - да, вау, эта глава нуждается в серьезном обновлении. Я займусь этим к выпуску следующей книги. - person CommonsWare; 20.03.2015
comment
@CommonsWare было бы здорово, если бы вы могли связать меня с обновленными именами постоянных образцов / общих ресурсов, которые я мог бы найти. Необходимо запустить это как можно скорее, а официальные документы чертовски разбросаны :( - person Angad; 20.03.2015
comment
@Angad: Извините, но у меня нет ничего под рукой. - person CommonsWare; 20.03.2015
comment
@CommonsWare только что заработал, спасибо за первоначальный подробный комментарий! Дал мне указатели относительно того, что для Google. - person Angad; 20.03.2015