Proveïdors de continguts
La manera d'accedir o de compartir informació amb altres aplicació és per mitjà dels proveïdors de continguts (content providers). No hi ha cap zona comuna, ja que cada aplicació té el seu espai d'execució i permisos propis.
Aquests proveïdors ens poden permetre, amb les dades, accedir-hi, modificar-les o fins i tot esborrar-les, sempre depenent del sistema de permisos que implementa l'Android. A més podrem oferir les nostres dades a altres aplicacions o bé incloure aquesta informació en algun proveïdor ja existent o implementant-ne un de propi i donar-li visibilitat.
Realment no treballarem mai amb un proveïdor concret sinó que utilitzarem classes intermèdies, com per exemple la classe ContentResolver. Per a aconseguir la instància que ens interessa simplement cridarem al mètode de la nostra activitat getContentResolver(), amb la qual cosa tindrem accés per a poder fer les accions d'inserir, modificar, esborrar i consultar la informació proporcionada pels proveïdors. Per al cas de consulta de dades també hi ha l'opció d'utilitzar el mètode managedQuery, que és equivalent al mètode del ContentResolver.query.
Les dades que intercanviarem seran en forma d'una única taula, independentment de quina en sigui la representació interna. Cada columna tindrà un nom i un tipus coneguts, per a poder tractar amb les dades (el nom de la columna). Cada fila de la taula tindrà un identificador únic, el nom de columna del qual serà _ID. A més hi ha uns URI que serviran per a identificar cadascun dels recursos o conjunt de recursos del proveïdor de continguts. Aquests URI tindran la forma següent:

En què:
- A és la part fixa per a identificar que es tracta d'un proveïdor.
- B és el nom de la classe Provider. És necessari declarar-la en el manifest.
- C és la ruta del proveïdor de continguts, que pot ser nul·la si només es proveeix informació d'un tipus, o bé complexa, com es vulgui, si hi ha diversos tipus, com per exemple trains/bcn o trains/mdm.
- D identifica una fila de les dades de manera única.
Per a poder fer una consulta de dades, tant el mètode managedQuery() com el query() reben els paràmetres següents:
- L'URI que hem vist abans. Si l'última part (D) és present es consultarà únicament una fila.
- Nom de les columnes que volem aconseguir. Si aquest paràmetre és nul significa que volem totes les dades.
- Un filtre a l'estil SQL. Seria tot el que pot venir en la sentència WHERE, però sense la paraula WHERE en concret. Si és nul es lliuraran totes les files.
- Una sèrie d'arguments de selecció. Igual com en altres llenguatges de consulta SQL, dins dels nostres filtres podem afegir caràcters interrogants (?) que només seran coneguts en temps d'execució. Aquí posarem els valors corresponents a aquests interrogants en cas d'existir.
- Un criteri d'ordenació. Igual que abans, de la mateixa manera que en l'SQL, es pot definir ordre ascendent o descendent.
Per a modificar les dades sempre haurem d'usar els mètodes del ContentResolver. Així hi podrem passar un URI, general si és inserció o modificació massiva, i concret d'una fila si es tracta d'actualitzacions o esborrament. A més, treballarem amb objectes ContentValues per a passar les dades que volem modificar.

