2011-02-15 12 views
9

Aquí hay una pregunta interesante que me sorprende que no se haya preguntado con más frecuencia en Internet. Los CursorAdapters de Android son extremadamente útiles una vez que obtienes un ContentProvider y aprendes cómo usarlo, pero están limitados debido a su requisito de tener el campo _id como parte de su consulta (se produce un error sin él). He aquí por qué:SimpleCursorAdapter de Android con consultas usando DISTINCT

Mi problema específico es que tengo dos spinners: un spinner debe contener nombres únicos de "categoría" de la base de datos, y el otro debe llenar con todas las entradas de la base de datos de la "categoría" seleccionada (categoría que es nombre de la columna, aquí). Esto parece una configuración bastante simple que muchos programas podrían usar, ¿no? Tratar de implementar ese primer spinner es donde he tenido problemas.

Aquí está la consulta que quisiera para ese primer spinner:

SELECT DISTINCT category FROM table; 

Hacer esta consulta genera un error en CursorAdapter porque se requiere la columna _ID como parte de la consulta. La adición de la columna _id a la proyección, naturalmente, devuelve cada fila de la tabla, ya que ahora también está solicitando identificadores distintos, y cada identificación es distinta (por definición). Obviamente, preferiría ver solo una entrada por nombre de categoría.

Ya he implementado una solución alternativa, que es simplemente hacer la consulta de arriba y luego copiar los resultados en un ArrayAdapter. Mi razón para este post es ver si había una solución más elegante para este pequeño y extraño problema y comenzar una discusión sobre lo que podría estar haciendo mejor. Sugerencias alternativas de implementación, como el uso de diferentes tipos de controles o adaptadores, son bienvenidos.

Respuesta

6

Aquí es la consulta que terminó con:

SELECT _id, category FROM table_name GROUP BY category; 

I usó la función rawQuery() en un objeto SQLiteDatabase para llevarlo a cabo. La pieza "GROUP BY" fue la clave para obtener los resultados correctos, así que gracias al usuario Sagar por apuntarme en la dirección correcta.

Considere también la respuesta del usuario Al Sutton a esta pregunta, ya que puede ser una solución más elegante a este problema.

¡Gracias a todos!

4

Sugiero tener una tabla separada con solo _id & categoría que contiene una fila por categoría única. Sus filas de datos pueden reemplazar su campo de categoría con el _id de la tabla de categorías.

Esto tiene la ventaja añadida de que puede cambiar la categoría en la tabla de categorías y se mostrará en todas las entradas de esa categoría.

+0

Oh, esto se parece a un excelente diseño de base de datos a ¡yo! Con el objetivo de mantener mi proveedor de contenido lo más simple posible, he recibido instrucciones de mantener el número de tablas al mínimo, o de lo contrario estaría haciendo lo que sugiera. Gracias por agregar esto! – SilithCrowe

+0

Su proveedor de contenido puede manejar saltear el nombre de categoría dentro y fuera de las filas suministradas y devuelto desde allí mediante el uso de una consulta de varias tablas. Eche un vistazo a la instrucción SQL "join". –

3
SELECT DISTINCT category,_id FROM table GROUP BY category; 

Yo creo esto debe darle lo que busca. Los resultados de esto serán la categoría y el primer _id para esa categoría. Puede ignorar la segunda columna (_id).

+0

El token DISTINCT hace que esto no funcione, ¡pero GROUP BY fue una excelente sugerencia! – SilithCrowe

0

Se puede especificar un alias de campo _id en su sentencia de selección que es sólo un valor constante, por ejemplo:

SELECT DISTINCT 0 _id, category FROM table;

0

Mejor aún, yo resuelto este problema mediante el uso de:

SELECT DISTINCT category AS _id FROM table 

Ahora, usted tiene una columna con el nombre _id, que tiene lo que quiere en ella

Cuestiones relacionadas