programacion - ¿Cuál es la diferencia entre contentprovider y contentResolver en android?
manual de programacion android pdf (5)
¿Cuál es la diferencia entre ContentProviders y ContentResolver ? No quiero para la SQLite
datos SQLite
. Estoy desarrollando una aplicación para medios.
Abstracción de dos capas:
ContentResolver -> ContentProvider -> SQLiteDatabase
La principal diferencia es esta como se menciona en otras respuestas.
ContentProvider expone los datos privados de su aplicación a una aplicación externa
mientras
ContentResolver proporciona el ContentProvider correcto entre todos los ContentProviders que utilizan un URI.
Entendimiento más profundo (de abstracción de dos capas)
Tomemos un desvío.
Todos sabemos que cuando creamos una base de datos SQLite, la base de datos permanece privada para su aplicación, lo que significa que no puede compartir los datos de su aplicación con ninguna otra aplicación externa.
¿Cómo se comparten los datos entonces?
ContentProvider y ContentResolver son parte del paquete android.content
. Estas dos clases trabajan juntas para proporcionar un modelo robusto y seguro de intercambio de datos entre aplicaciones.
ContentProvider expone los datos almacenados en la base de datos SQLite a otra aplicación sin decirles la implementación subyacente de su base de datos.
Así se abstrae la SQliteDatabase. Pero espere hay una trampa !!!
La aplicación externa no puede acceder directamente a ContentProvider. Para eso, primero debes interactuar con otra clase llamada ContentResolver Think ContentResolver como buscador de ContentProvider. Solo hay una instancia y todos los proveedores de contenido de su dispositivo están registrados con un simple URI de espacio de nombres. Si desea acceder a un ContentProvider en particular, solo necesita conocer su URI. Páselo a ContentResolver y encontrará al Proveedor utilizando el URI.
Ahora veamos el método más importante getContentResolver().query(URI,String[] proj.....)
Qué sucede cuando se
getContentResolver().query(URI,String[] proj.....)
query()
método query()
pertenece a la clase ContentResolver; sin embargo, invoca el método abstract query () del ContentProvider resuelto y devuelve el objeto Cursor.
De esta manera, la aplicación externa se expone a la base de datos privada a través de dos capas de abstención.
Solo para sumar más puntos.
No puede crear su propia clase ContentResolver pero siempre puede crear su propia clase ContentProvider
Espero que tengas una mejor comprensión
También puede ver algunos ejemplos de código here para crear una base de datos SQL, ContentProvider, etc., pero no está bien documentado.
He encontrado una explicación here . En resumen
La resolución de contenido resuelve un URI a un proveedor de contenido específico.
Proveedor de contenido proporciona una interfaz para consultar el contenido.
La forma de consultar a un proveedor de contenido es contentResolverInstance.query(URI,.....)
Llegue tarde que nunca. He encontrado una buena explicación práctica. Demostrando
Supongamos que quiere retirar dinero de un banco. Tendrás que seguir con los siguientes pasos.
Cajero en ABC Bank (Content Resolver) -> ABC Bank Gateway (Proveedor de contenido) -> Bank Server (Base de datos).
El Cajero no conoce la implementación de la pasarela del Banco ni la base de datos del Banco.
De la misma manera, la resolución de contenido consultará al proveedor de contenido y ContentProvider expondrá los datos almacenados en la base de datos SQLite a otra aplicación sin informar la implementación de su base de datos.
Usted puede entender fácilmente de esta manera,
Los proveedores de contenido se utilizan para
expose data
.
por otra parte
La resolución de contenido es la
corresponding class
utilizada paraquery
y realizarTransactions
en esosContent Providers
.
La resolución de contenido incluye transaction methods
query
y transaction methods
correspondientes a aquellos dentro de sus proveedores de contenido .
ContentProviders
se utilizan para abstraer la base de datos de otras partes y actúan como una interfaz entre su base de datos y la UI / otras clases. Debe crear su propio ContentProvider para compartir los datos de su aplicación con otras aplicaciones .
ContentResolver
se utiliza para seleccionar el ContentProvider correcto en función de ContentUris
. Un ContentUri puede parecer
contenido: //com.android.contacts/contacts/3
- content: // se llama esquema e indica que es ContentUri.
- com.android.contacts se denomina autoridad de contenido y ContentResolver lo utiliza para resolver a un proveedor único (en este caso, ContactProvider).
- contactos es la ruta que identifica algún subconjunto de los datos del proveedor (por ejemplo, Nombre de la tabla).
- 3 es el ID utilizado para identificar de forma única una fila dentro del subconjunto de datos.
NOTA: Su propia aplicación también puede utilizar esta ruta para manejar sus datos.
Ver proveedores de contenido en Android para más detalles