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-объектов.

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

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

Что-то вроде этого возможно? как я могу ускорить процесс?

    @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); 

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

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

    ОБНОВИТЬ

      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); 
    Давайте будем гением компьютера.