I am currently working with the Android Contacts content provider and currently cannot access the full-featured display name of the contacts using the following code:
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);
However, I want to get both the contacts and the last name separately, I tried to use StructuredName in an attempt to get this, but I can not get it to work.
Can someone point me in the right direction how to use StructuredName correctly to split the name into First and Last?
UPDATE:
Following hovanessyan's advice, I tried to do the following:
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); }
However, using PROJECTION fails as follows:
12-08 16:52:01.575: E/AndroidRuntime(7912): Caused by: java.lang.IllegalArgumentException: Invalid column has_phone_number
If I delete PROJECTION, I get all the printed results, but many of them contain NULL.
For example:
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
So can anyone see what I am doing wrong in that my PROJECTION is not working?
FURTHER UPDATE:
I found out the problems with my PROJECTION, but now I have a problem when the DATA content provider returns me all null data and throws null pointers in my code.
The number of cursors from ContactsContract.Contacts returns me 115, for example, but using the DATA table returns 464 to me using the same parameters, and this causes huge problems in my application.
Does anyone have any idea why this is?