studio seleccionar read obtener lista example contactos android android-emulator android-contacts contactscontract android-sqlite

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?