В настоящее время я работаю с поставщиком содержимого контактов Android и в настоящее время могу без проблем получить доступ к полному отображаемому имени контактов, используя следующий код:
String[] PROJECTION = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.HAS_PHONE_NUMBER,
};
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
String SELECTION = "LOWER(" + ContactsContract.Contacts.DISPLAY_NAME + ")"
+ " LIKE '" + constraint + "%' " + "and " +
ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'";
Cursor cur = managedQuery(ContactsContract.Contacts.CONTENT_URI,
PROJECTION, SELECTION, null, sortOrder);
Однако я хочу, чтобы сначала я смог получить оба контактаи по фамилии отдельно, я пытался использовать StructuredName в попытке получить это, но я не могу заставить его работать.
Может ли кто-нибудь указать мне правильное направление относительно того, как использовать StructuredNameправильно, чтобы разделить имя на Первое и Последнее?
ОБНОВЛЕНИЕ:
Следуя совету Ованесяна, я попытался сделать следующее:
String[] PROJECTION = new String[] {
ContactsContract.Data._ID,
ContactsContract.Data.DISPLAY_NAME,
ContactsContract.Data.HAS_PHONE_NUMBER,
};
String SELECTION = ContactsContract.CommonDataKinds.StructuredName.IN_VISIBLE_GROUP + " = '1'";
String sortOrder = ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
Cursor cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null, sortOrder);
int indexGivenName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
int indexFamilyName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME);
int indexDisplayName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME);
while (cursor.moveToNext()) {
String given = cursor.getString(indexGivenName);
String family = cursor.getString(indexFamilyName);
String display = cursor.getString(indexDisplayName);
Log.e("XXX", "Name: | " + given + " | " + family + " | " + display);
}
Однакоиспользование PROJECTION вызывает сбой следующим образом:
12-08 16:52:01.575: E/AndroidRuntime(7912): Caused by: java.lang.IllegalArgumentException: Invalid column has_phone_number
Если я удаляю PROJECTION, я распечатываю все результаты, но многие из них содержат NULL.
Например:
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
Так может ли кто-нибудь увидеть, что я делаю неправильно в том, что мой ПРОЕКЦИЯ не работает?
ДОПОЛНИТЕЛЬНОЕ ОБНОВЛЕНИЕ:
Я разобралсяпроблемы с моим PROJECTION, но теперь у меня есть проблема, когда провайдер контента DATA предоставляет мне все нулевые данные и вызывает исключения кода NULL в моем коде.
Количество курсоров из ContactsContract.Contacts возвращает мне 115например, но использование таблицы DATA возвращает мне 464 с использованием тех же параметров, и это вызывает огромные проблемы в моем приложении.
У кого-нибудь есть идеи, почему это так?