The following request is executed on my device (API 15). API 8 or API 10 does not work in my emulator.
Here is the request:
Cursor contactsCur = getContentResolver().query( ContactsContract.Data.CONTENT_URI, new String[] { ContactsContract.Data._ID, ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Organization.COMPANY, ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.Data.LOOKUP_KEY, ContactsContract.CommonDataKinds.Phone.NUMBER, Contacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CITY, ContactsContract.CommonDataKinds.StructuredPostal.STREET, ContactsContract.CommonDataKinds.StructuredPostal.REGION, ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE}, ContactsContract.Data.HAS_PHONE_NUMBER + " >? ", new String[] { "0" }, ContactsContract.Data.DISPLAY_NAME + " COLLATE NOCASE ASC");
Here is the exception that it throws: android.database.sqlite.SQLiteException: no such column: has_phone_number: , while compiling: SELECT _id, contact_id, display_name, data1, data2, lookup, data1, mimetype, mimetype, data7, data4, data8, data9 FROM view_data_restricted data WHERE (1) AND (has_phone_number >? ) ORDER BY display_name COLLATE NOCASE ASC
Oddly enough, the following code also does not work:
Cursor contactsCur = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] { ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER}, ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER + " >? ", new String[] { "0" }, null);
This gives: java.lang.IllegalArgumentException: Invalid column has_phone_number
http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html claims that ContactsContract.CommonDataKinds.Phone has access to HAS_PHONE_NUMBER From the android.provider.ContactsContract.ContactsColumns interface
To add to the weirdness, this query works:
Cursor contactsCur = getContentResolver().query( ContactsContract.Data.CONTENT_URI, new String[] { ContactsContract.Data.LOOKUP_KEY}, null, null, null);
But this is not:
Cursor contactsCur = getContentResolver().query( ContactsContract.Data.CONTENT_URI, new String[] { ContactsContract.Data.HAS_PHONE_NUMBER}, null, null, null);
ContactsContract.Data.LOOKUP_KEY comes from the same implicit union as ContactsContract.Data.HAS_PHONE_NUMBER !
Where am I going wrong?