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-объектов.
что мне было интересно, можно ли было просто запросить поставщика контента и вернуть курсор из только контактов с идентификаторами/именем и т.д., в которых указан адрес электронной почты.
этот способ имеет длительный период ожидания для получения списка контактов. Я использую этот список для адаптера списка. если я могу получить только контакты, у которых есть письмо, я могу использовать адаптер курсора в моем списке.
Что-то вроде этого возможно? как я могу ускорить процесс?
Ответы
Ответ 1
Я решил это, вот как это делается:
UPDATE
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);
Ответ 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);
Курсор будет иметь важные идентификаторы, а также имена и адреса электронной почты. Производительность этого кода велик, потому что он запрашивает только несколько столбцов.