Получить имя и фамилию контакта, а не одно отображаемое имя?

В настоящее время я работаю с поставщиком контента 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 с использованием тех же параметров, и это вызывает огромные проблемы в моем приложении.

У кого-нибудь есть идеи, почему это так?

8
задан Donal Rafferty 8 December 2011 в 17:55
поделиться