Android получает курсор только с контактами, у которых указана электронная почта ›android 2.0

у меня есть следующий код для получения контактов от content provider

String[] columns = new String[] {
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.PHOTO_ID };
        Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,
                columns, null, null, null);

и я использую это, чтобы получить электронные письма для определенного контакта по их идентификатору:

Cursor emails = getContentResolver().query(
                    ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Email.CONTACT_ID
                            + " = " + contact.getContactId(), null, null);

моя текущая реализация передает каждую строку в курсоре, получает ее электронные письма и сохраняет их в массиве объектов Java.

мне было интересно, можно ли просто запросить поставщика контента и вернуть курсор только контактов с идентификаторами/именами и т. д., у которых указан адрес электронной почты.

этот способ имеет длительный период ожидания для получения списка контактов. я использую этот список для адаптера списка. если я могу получить только контакты, у которых есть электронная почта, я могу использовать адаптер курсора в своем списке.

Возможно ли что-то подобное? как можно ускорить процесс?


person DArkO    schedule 05.03.2011    source источник


Ответы (2)


@CapDroid

Исправлен рабочий код из поста DArkO:

    ContentResolver cr = context.getContentResolver();
    String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, 
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts.PHOTO_ID,
            ContactsContract.CommonDataKinds.Email.DATA, 
            ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
    String order = "CASE WHEN " 
            + ContactsContract.Contacts.DISPLAY_NAME 
            + " NOT LIKE '%@%' THEN 1 ELSE 2 END, " 
            + ContactsContract.Contacts.DISPLAY_NAME 
            + ", " 
            + ContactsContract.CommonDataKinds.Email.DATA
            + " COLLATE NOCASE";
    String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''";
    Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order);

Ваш курсор будет иметь важные идентификаторы, а также имена и адреса электронной почты. Производительность этого кода велика, потому что он запрашивает только несколько столбцов.

person Marcin    schedule 04.04.2013
comment
для чего нужен этот заказ? - person gyosida; 24.12.2014
comment
чтобы это работало на моем LG G3, мне пришлось изменить фильтр на ‹› '' вместо NOT LIKE '' - person AndreasEK; 08.04.2015

Я решил это, вот как это делается:

ОБНОВЛЕНИЕ

   String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID,
        ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID,
        Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID };

    String order = " CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME
        + " NOT LIKE '%@%' THEN 1" + " ELSE 2 END, "
        + ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE";
    String filter = Email.DATA + " NOT LIKE '' ) GROUP BY ( " + Email.DATA;

    return mContent.query(Email.CONTENT_URI,
                      PROJECTION, filter, null, order);
person DArkO    schedule 07.03.2011