В настоящее время я работаю с поставщиком контента Android Contacts и в настоящее время могу получить доступ к полному отображаемому имени контакта без проблем, используя следующий код:
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, чтобы разделить имя на First и Last?
ОБНОВЛЕНИЕ:
Следуя совету Хованесяна, я попытался сделать следующее:
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
Может ли кто-нибудь увидеть, что я делаю неправильно в том, что мой ПРОЕКЦИЯ не работает?
ДАЛЬНЕЙШЕЕ ОБНОВЛЕНИЕ:
Я решил проблемы с моим ПРОЕКЦИЕЙ, но теперь у меня есть проблема, при которой поставщик содержимого DATA возвращает мне все нулевые данные и вызывает исключения NULL-указателя в моем коде.
Счетчик курсоров из ContactsContract.Contacts возвращает мне 115, например, но использование таблицы DATA дает мне 464 с использованием тех же параметров, и это вызывает огромные проблемы в моем приложении.
У кого-нибудь есть идеи, почему это так?