El tutor de nuestro curso online de Desarrollo de Aplicaciones para Android, Víctor Ramírez Las,…
Contacts Provider: acceso al repositorio de datos de contacto
2.
Contacts Provider: acceso al repositorio de datos de contacto
Siguiendo con nuestra primera serie de publicaciones sobre Content Provider, vamos a ver uno que proporciona Android, denominado Contacts Provider y que permite el acceso al repositorio central de datos de contactos de personas almacenadas en el dispositivo móvil.
El Contacts Provider almacena tres tipos de datos acerca de una persona, en el que cada uno de estos datos corresponde a una tabla proporcionada por el proveedor:
Se definen tres tablas, construidas a partir de las clases de contratos:
ContactsContract.Contacts
Proporciona una serie de constantes para la tabla de contactos, que define un registro por cada nuevo raw contact que representa a una misma persona.
Operaciones:
- Insertar: No es posible insertar un nuevo contacto de manera explícita. Es necesario en primer lugar que el provider compruebe la existencia del contacto que represente a la persona (a través del campo
contact_id
del nuevo contacto), en caso de no existir, el provider insertará un nuevo contacto asignándole un _ID en la columna comentada anteriormente. - Actualizar: Cualquier modificación del contacto se hará efectiva en todos los raw contacts que constituya. No es posible la modificación de las siguientes columnas:
TIMES_CONTACTED, LAST_TIME_CONTACTED, STARRED, CUSTOM_RINGTONE, SEND_TO_VOICEMAIL
. - Eliminar: En caso de eliminar un contacto, los adaptadores de sincronización se encargarán de ejecutar la operación en todos los raw contacts donde esté definido.
- Consultar:
- Búsqueda de un contacto:
CONTENT_LOOKUP_URI
(URI) - Búsqueda de un contacto por número de teléfono:
PhoneLookup.CONTENT_FILTER_URI
(URI) - Búsqueda de un contacto por nombre aproximado:
CONTENT_FILTER_URI
(URI) - Búsqueda de un contacto por correo electrónico o sobrenombre: consulta sobre la tabla
ContactsContract.Data
- Búsqueda de un contacto:
Documentación oficial Android ContactsContract.Contacts
ContactsContract.RawContacts
Define una serie de constantes de la tabla raw contacts, formada por una fila que contendrá información de un contacto por cada cuenta sincronizada.
Operaciones:
- Insertar: Es posible insertar un contacto de manera incremental o por lotes.
Ejemplo incremental:
1 2 3 4 5 6 |
ContentValues values = new ContentValues(); values.put(RawContacts.ACCOUNT_TYPE, accountType); values.put(RawContacts.ACCOUNT_NAME, accountName); Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values); long rawContactId = ContentUris.parseId(rawContactUri); |
Ejemplo por lotes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ... int rawContactInsertIndex = ops.size(); ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) .withValue(RawContacts.ACCOUNT_TYPE, accountType) .withValue(RawContacts.ACCOUNT_NAME, accountName) .build()); ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) .withValue(StructuredName.DISPLAY_NAME, "Mike Sullivan") .build()); getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); |
- Actualizar: Es posible actualizar un contacto de manera incremental o por lotes. Es recomendable, siempre que sea posible, utilizar el modo por lotes.
- Eliminar: Cuando se elimina un raw contact, todas las filas de datos serán también eliminadas. Cuando se eliminan todos los raw contacts de un Contacto, se eliminará toda la información almacenada de este Contacto.
- Consultar: Para la realización de una consulta que devuelva todos los raw contacts de un contacto, será necesario insertar el siguiente código:
12345Cursor c = getContentResolver().query(RawContacts.CONTENT_URI,new String[]{RawContacts._ID},RawContacts.CONTACT_ID + "=?",new String[]{String.valueOf(contactId)}, null);
Documentación oficial Android ContactsContract.RawContacts
ContactsContract.Data
Implementa las constantes para la tabla Data. Cada fila de dicha tabla se utiliza para almacenar un sólo bloque de información de contacto, como por ejemplo el número de teléfono, además de sus metadatos asociados.
Operaciones:
- Insertar: Para insertar una fila de datos individual, bastará con invocar al método
insert(Uri, ContentValues)
. Para insertar múltiples filas, deberá realizarse mediante la inserción de un lote:
Ejemplo para insertar una fila individual de datos:
1 2 3 4 5 6 7 8 |
ContentValues values = new ContentValues(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); values.put(Phone.NUMBER, "1-800-GOOG-411"); values.put(Phone.TYPE, Phone.TYPE_CUSTOM); values.put(Phone.LABEL, "free directory assistance"); Uri dataUri = getContentResolver().insert(Data.CONTENT_URI, values); |
- Actualizar: Es posible realizar operaciones de actualización tanto de forma incremental como por lotes. Se recomienda el uso de lotes:
Ejemplo de actualización por lotes:
1 2 3 4 5 6 7 8 |
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI).withSelection(Data._ID + "=?", new String[]{String.valueOf(dataId)}) .withValue(Email.DATA, "somebody@android.com") .build()); getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); |
- Eliminar: Esta operación es posible, mediante la llamada al método
delete(Uri, String, String[])
, o usando unContentProviderOperation
:
Ejemplo uso de ContentProviderOperation:
1 2 3 4 5 6 7 8 |
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ops.add(ContentProviderOperation.newDelete(Data.CONTENT_URI) .withSelection(Data._ID + "=?", new String[]{String.valueOf(dataId)}) .build()); getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); |
- Consultar: Bastará con la llamada al método
query(Uri,projection,selection,selectionArgs,sortOrder)
:
Ejemplo que devuelve todos los datos de un determinado tipo, para un contacto dado:
1 2 3 4 5 |
Cursor c = getContentResolver().query(Data.CONTENT_URI, new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL}, Data.CONTACT_ID + "=?" + " AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'", new String[] {String.valueOf(contactId)}, null); |
Documentación oficial Android ContactsContract.Data
Ejemplo de relación entre las tres tablas principales
Créditos: las imágenes de esta publicación provienen de la documentación oficial Android sobre Contacts Provider publicada con licencia Creative Commons Attribution 2.5