2011-02-08 13 views
90

Entiendo que los proveedores de contenido están hechos para permitir el intercambio público de datos entre las aplicaciones. Sin embargo, me pregunto si alguien piensa en hacer que un proveedor de contenido lo use solo dentro de su propia aplicación. ¿Habría alguna ventaja al hacer esto? Cualquier desventaja?Cuándo utilizar un proveedor de contenido

En el pasado acabo de implementar SQliteOpenHelper para acceder a los datos de mi base de datos, pero estoy considerando crear un proveedor de contenido. Siento que el enfoque URI para solicitar datos es claro y conciso. Por otro lado, el uso de un proveedor de contenido solo para mi aplicación será redundante (ya que dentro de él tendré una clase SQliteOpenHelper) y más trabajo del que necesito.

+2

Hice una biblioteca para que el proveedor de contenido sea fácil de escribir. Aún más fácil que escribir SQLiteOpenHelper sencillo. https://github.com/coocood/VContentProvider – coocood

Respuesta

50

Si no planea compartir datos, no piense en los proveedores de contenido. Son poderosos pero difíciles de escribir y será tonto implementarlos si los va a usar internamente.

Sin embargo, me pregunto si alguien tiene pensamientos sobre la fabricación de un proveedor de contenido de usar sólo dentro de su propia aplicación.

Por supuesto ... por ejemplo, para una aplicación antigua lista de cosas que escribí, que tenía que escribir un proveedor de contenido para permitir que otras aplicaciones recuperar y acceder a los estados tareas. Era parte de los requisitos, pero más que eso tenía sentido e hizo la aplicación más agradable.

+34

Estoy de acuerdo con su justificación, pero también creo que es importante (especialmente para los principiantes) que una vez que se implemente el proveedor de contenido, obtenga muchos beneficios. Por ejemplo, puede usar 'CursorLoader' para realizar consultas asíncronas ... tiene acceso a una instancia de singleton (' ContentResolver') para realizar consultas, etc. Por supuesto, puede implementar su propio cargador para usar en su base de datos SQLite ... por supuesto, podría implementar el acceso a una única instancia de base de datos en toda la aplicación ... y, por supuesto, no se requiere un ContentProvider a menos que desee compartir –

+10

datos con otras aplicaciones. Dicho esto, existen * muchos * beneficios que se obtienen al implementar su propio proveedor de contenido, por lo que no debe descartarlo solo porque su aplicación no comparta sus datos. –

+7

Sí, tiene toda la razón, pero todavía creo que no vale la pena el esfuerzo en la mayoría de los casos. He hecho al menos 12 aplicaciones diferentes de Android (publicadas en Play Store) y nunca he necesitado un 'ContentProvider'. De hecho, la última aplicación en la que estábamos trabajando se hizo inicialmente con un 'ContentProvider' y simplemente lo eliminamos, ya que en realidad es más difícil de usar que de costumbre (incluso escribí una biblioteca para que sea más fácil de implementar 'ContentProvider's básico: https://github.com/casidiablo/persistence pero nunca lo usé yo mismo XD). – Cristian

7

Eche un vistazo al MOTODEV Studio for Eclipse. Es un entorno de desarrollo que amplía Eclipse. Tienen una herramienta donde puedes generar automáticamente un proveedor de contenido para una base de datos. Si un proveedor de contenido facilita el acceso a sus datos y no tiene un impacto significativo en el rendimiento, siga adelante y úselo. En la mayoría de los escenarios, este será el caso.

109

Yo diría que definitivamente es una buena idea usar un ContentProvider, incluso si no tiene la intención de hacerlo público.

Es una buena práctica proporcionar un nivel extra de abstracción sobre sus datos para facilitar el cambio interno. ¿Qué sucede si decide cambiar la estructura de la base de datos subyacente en un momento posterior? Si usa un ContentProvider puede contener todos los cambios estructurales dentro de él, donde si no usa uno, se ve obligado a cambiar todas las áreas del código que se ven afectadas por los cambios estructurales. Además, es bueno poder reutilizar la misma API estándar para acceder a los datos en lugar de ensuciar el código con acceso de bajo nivel a la base de datos.

Además, siempre existe la posibilidad de que desee exponer sus datos en el futuro. Si no utiliza un ContentProvider por adelantado, será mucho más difícil volver a instalarlo en una fecha posterior.

Luego, están las otras partes de Android donde ContentProvider son obligatorios/recomendados, como cuando se usa SyncAdapter sy si desea un widget de aplicación que implique acceso a datos, por ejemplo.

En resumen, hay muy poca información general involucrada en escribir un ContentProvider por adelantado (una vez que haya aprendido la API, que es una buena idea) así que tiene sentido hacerlo, incluso para datos privados.

+1

No podría estar más de acuerdo. Te obliga a abstraer tu capa de datos de una manera que prácticamente garantiza que un nuevo desarrollador no pueda acoplar la interfaz de usuario con ella. – Gabriel

+3

Inmediatamente después de aprender Android, comencé a pensar de la misma manera exactamente por esta razón. Incluso si no es público, siempre puede beneficiarse de la mayor abstracción y del único punto de implementación de sus decisiones arquitectónicas. Me encanta ContentProviders. – davidcesarino

+0

No obtuve el mensaje "¿Qué sucede si decide cambiar la estructura de la base de datos subyacente más adelante? Si utiliza un proveedor de contenido, puede contener todos los cambios estructurales que contiene". Por favor ayúdame con eso? – Darpan

4

Acepto que los ContentProviders son un poco difíciles de entender, pero definitivamente son útiles, incluso si desea usarlos internamente para su propia aplicación. Lo mejor de todo es que puede personalizar los proveedores de contenido para los URI adecuados.

Aquí hay un escenario en el que puede tener 5 tablas en su base de datos, pero debe unir algunas de ellas en ciertos pedidos antes de usarlas. Y crea un URI de contenido para cada una de estas uniones. Cada uno de ellos puede utilizar estos URI como una tabla :)

Le sugiero que continúe con el proveedor de contenido, se sorprenderá al ver lo poderoso que es.

-1

No utilice el proveedor de contenido si no desea compartir datos con otras aplicaciones. Use una base de datos sqlite simple para realizar operaciones de bases de datos. Tenga cuidado al usar proveedores de contenido para almacenar datos confidenciales, ya que otras aplicaciones pueden acceder a su información confidencial

+0

Por defecto, los proveedores de contenido no están expuestos, y administrar las restricciones de acceso a ellos es fácil. Voto a favor de difundir desinformación. – TBridges42

+0

@ TBridges42 Usted está (estaba) equivocado. De hecho, hasta que [los proveedores de contenido de nivel 17 de API estuvieron expuestos] (https://developer.android.com/guide/topics/manifest/provider-element.html#exported). Y hasta el momento de la respuesta [el 25% de los dispositivos Android se vieron afectados] (https://www.bidouille.org/misc/androidcharts) de este comportamiento y aún [10% en el momento de su comentario] (https://www.bidouille.org/misc/androidcharts). Por lo tanto, es más al revés: su comentario es peligroso, ya que afirma algo que es seguro, que es/no era el hecho. – Murmel

2

En mi punto de vista, el proveedor de contenido ofrece muchas ventajas, solo compartir datos con otras aplicaciones. Si necesita sincronizar con el servidor utilizando un Sync-Adapter, use la mensajería de google en la nube, actualice automáticamente la interfaz de usuario cuando los datos subyacentes en la base de datos cambien usando cargadores, implemente búsquedas, use widgets ... entonces el proveedor de contenido es para usted.

prefiero seguir la directriz sobre porque un día puede que tenga que poner en práctica algunas de las características anteriores unidos al proveedor de contenidos

Por cierto, usted puede crear rápidamente la base de datos y CP en menos de 5 minutos usando content provider generator

0

Como se dijo en la documentación: Creating a Content provider

no es necesario un proveedor de utilizar una base de datos SQLite si el uso es enteramente dentro de su propia aplicación .

¿Por qué molestarse en desarrollar esta sobrecarga? ¿Quieres un desarrollo más fácil y rápido, verdad? Entonces, una capa de abstracción (SQLiteOpenHelper descenddent) es suficiente.

Ver Occam's Razor No haga una entidad sin una buena razón.

2

En resumen, Content Providers ayuda en administrando sus datos de manera efectiva. Sugeriría usarlos por las siguientes razones.

  • actúa como una capa de abstracción entre la interfaz de usuario y la base de datos de. Puede implementar validación de datos en ContentProviders para validar los datos ingresados ​​por el usuario. También le permite modificar la estructura de la base de datos sin tocar la interfaz de usuario y otras partes.
  • Funcionan muy bien con otras clases de android framework como SyncAdapter. Por ejemplo, puede actualizar automáticamente una lista, cuando un valor en una base de datos cambia usando ContentProviders junto con CursorLoader. Sin ContentProviders debe implementar muchas funcionalidades como estas por su cuenta.
  • Podemos exponer con seguridad nuestros datos privados a otras aplicaciones. El uso de ContentProviders nos permitirá compartir nuestros datos de manera fácil y segura con otras aplicaciones.

Así que incluso si no necesita ninguna de estas funcionalidades ahora, puede necesitarlas en el futuro y es bueno hacer un esfuerzo adicional y ponerlas en práctica en este momento.

Cuestiones relacionadas