seleccionar - read contacts android studio
Android API 8, 10 ContactsContract.Data.HAS_PHONE_NUMBER no dicha columna (1)
El principal problema al que te estás has_phone_number=1
es que ContactsContract.CommonDataKinds.Phone.CONTENT_URI
filtra automáticamente has_phone_number=1
. Por lo tanto, puede estar seguro de que todo lo que sale de Phone.CONTENT_URI
tiene un número de teléfono. A continuación, puede filtrar más hacia abajo comprobando si Phone.TYPE
es una de Phone.TYPE_MOBILE
o Phone.TYPE_WORK_MOBILE
(por ejemplo) si desea restringir qué tipo de número de teléfono tiene.
Como referencia (tenga en cuenta que has_phone_number
está ausente del URI de data/phones
):
Columns for content://com.android.contacts/contacts:
- times_contacted
- contact_status
- custom_ringtone
- has_phone_number
- phonetic_name
- phonetic_name_style
- contact_status_label
- lookup
- contact_status_icon
- last_time_contacted
- display_name
- sort_key_alt
- in_visible_group
- _id
- starred
- sort_key
- display_name_alt
- contact_presence
- display_name_source
- contact_status_res_package
- contact_status_ts
- photo_id
- send_to_voicemail
y:
Columns for content://com.android.contacts/data/phones:
- data_version
- phonetic_name
- phonetic_name_style
- contact_id
- lookup
- data12
- data11
- data10
- mimetype
- data15
- data14
- data13
- display_name_source
- data_sync1
- data_sync3
- data_sync2
- data_sync4
- account_type
- custom_ringtone
- status
- data1
- data4
- data5
- data2
- data3
- data8
- data9
- group_sourceid
- data6
- account_name
- data7
- display_name
- in_visible_group
- display_name_alt
- contact_status_res_package
- is_primary
- contact_status_ts
- raw_contact_id
- times_contacted
- contact_status
- status_res_package
- status_icon
- contact_status_icon
- mode
- version
- last_time_contacted
- res_package
- _id
- name_verified
- status_ts
- dirty
- is_super_primary
- photo_id
- send_to_voicemail
- name_raw_contact_id
- contact_status_label
- status_label
- sort_key_alt
- starred
- sort_key
- contact_presence
- sourceid
La consulta siguiente funciona bien en mi dispositivo (API 15). No funciona en mi emulador ejecutando API 8 o API 10.
Aquí está la consulta:
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");
Aquí está la excepción que arroja: 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
Por extraño que parezca, el siguiente código tampoco funciona:
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);
Se obtiene: java.lang.IllegalArgumentException: Invalid column has_phone_number
http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html indica que ContactsContract.CommonDataKinds.Phone
tiene acceso a HAS_PHONE_NUMBER
desde la interfaz android.provider.ContactsContract.ContactsColumns
Para agregar a la extrañeza, esta consulta funciona:
Cursor contactsCur = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[] { ContactsContract.Data.LOOKUP_KEY},
null,
null,
null);
Pero este no:
Cursor contactsCur = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[] { ContactsContract.Data.HAS_PHONE_NUMBER},
null,
null,
null);
ContactsContract.Data.LOOKUP_KEY
proviene de la misma unión implícita que ContactsContract.Data.HAS_PHONE_NUMBER
!
¿Dónde estoy equivocado?