2011-07-05 10 views
7

Tengo una aplicación simple de Notes que es similar en funcionalidad a la muestra de Android NotePad. Una adición es que cada nota puede tener etiquetas. Un Note puede tener varios Tag sy Tag pueden pertenecer a varios Note s, lo que hace que esta relación sea de muchos a muchos.Proveedor de contenido de Android y relación DB de muchos a muchos

He completado el diseño de la base de datos utilizando claves externas y una tabla de asignación. Ahora, deseo que mi aplicación se conecte a Android Search Framework, que necesita el uso de un ContentProvider para exponer mis datos.

¿Hay alguna práctica recomendada para este escenario? Encontré algunas preguntas relacionadas en SO, pero la mayoría de ellas trataban con relaciones uno a muchos (this one por ejemplo). Concluí de estas preguntas que es mejor tener un solo ContentProvider por base de datos, y luego utilizar el concepto de Matcher para resolver múltiples tablas dentro del DB. Eso todavía deja abiertas otras preguntas.

  1. dado un Note ID, me gustaría devolver todas las etiquetas asociadas a dicha nota. ¿Cómo hago para configurar el ContentUri para este caso? Ni "content://myexample/note/#" ni "content://myexample/tag/#" cumplirían el propósito.

  2. Ninguno de los 6 ContentProvider métodos que anulo se adaptaría a tal propósito, ¿verdad? Por supuesto, puedo introducir un nuevo método, pero los consumidores de mi ContentProvider no lo entenderían.

Gracias de antemano por sus sugerencias.

Respuesta

5

Sí, necesita implementarlo utilizando ContentProvider cuando desee implementar la búsqueda.

Puede usar su proveedor de contenido existente para recuperar las etiquetas asociadas con una nota.

puede definir otra URL que decir en la forma "contenido: // myExample/nota/tag/#" para obtener todas las etiquetas asociadas a un nodo en particular.

Usted tendrá que añadir otra URI que tiene que ser igualado en su matcher URI. dicen algo como GET_NOTE_TAGS = 3;

En el método de la getType ContentProvider, devolver el tipo MIME adecuado. Supongo que este será el mismo que el tipo de mimo para las etiquetas, ya que está devolviendo las mismas etiquetas.

Luego, en la consulta/actualizar/borrar/métodos de inserción analizar el URI de entrada para que coincida con "contenido: // myExample/nota/tag/#". Luego implemente su consulta de forma adecuada en su base de datos o su contenido y devuelva las etiquetas que necesita devolver.

El "contenido: // myExample/nota/tag/#" esquema es sólo un ejemplo y se pueden utilizar múltiples URIs dentro de la misma ContentProvider.

También indicó que debe unir las tablas. eso se puede hacer usando db.query y si se vuelve complicado puede usar rawqueries, para obtener los datos que necesita de la base de datos.

+0

Gracias por la pista sobre '" contenido: // myexample/note/tag/# "'. Estoy aceptando esto como una respuesta, ya que me ha ayudado en mi camino. – curioustechizen

9

ahora encuentro algunas cosas interesantes acerca de la relación de entrada de muchos a muchos en Android ContentProvider. La respuesta proviene del código fuente del Cliente oficial para Android de Google I/O 2011.Por ejemplo, en la aplicación Google I/O, hay una entrada llamada Session y otra entrada es Speaker. Uno Session puede tener varios Speaker y uno Speaker asistirá a varios Session.

Por lo tanto, vamos a echar un vistazo sobre la solución del google:

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleProvider.java

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleContract.java

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleDatabase.java

Quizás esta respuesta le ayudará a chicos.

Cuestiones relacionadas