¿Cómo pasar el nombre de la columna como parámetro en la base de datos de la habitación? [duplicar]
Estoy usando roomdatabase
y tengo muchas categorías para consultar.
@Query("SELECT * FROM Table_name WHERE sweets = 1")
LiveData<List<Item>> getAllSweets();
@Query("SELECT * FROM Table_name WHERE drinks = 1")
LiveData<List<Item>> getAllDrinks();
Entonces, la pregunta es, ¿es posible realizar una consulta universal y pasar el nombre de la columna como parámetro? Por ejemplo:
@Query("SELECT * FROM Table_name WHERE :columnname = drinks AND :columnname = 1")
LiveData<List<Item>> getAllDrinks(String drinks);
Sé que me refiero al columnName pero si columnName es type int
, ¿no debería serlo?
LiveData<List<Item>> getAllDrinks(int drinks)
Respuestas
Respuesta corta: no puede hacer eso porque SQLite no lo permite, marque aquí .
Respuesta larga:
Hay un par de inconvenientes en su modelo:
- Modelo de diseño de base de datos: No es un buen diseño de base de datos en términos de normalización de datos ; ¿por qué? Tiene una columna para
sweets
, otra paradrinks
, tal vez una parameals
.. Más columnas, significa más almacenamiento de datos, más campos nulos en los registros, y necesita un método de base de datos para consultar cada columna por separado (como su pregunta) - Tener un nombre de columna variable puede ser propenso a errores: ¿qué sucede si pasa una columna que no existe en la base de datos? Esta es una de las características que le
Room
proporciona un resumenSQL queries
donde Room le proporciona errores en tiempo de compilación para nombres de columna incorrectos mientras que SQLite normal los genera en tiempo de ejecución.
Lo que te animo a hacer:
Cree una sola columna que indique el tipo de comida; para mayor eficiencia, puede crearlo de tipo int
y asignar cada valor entero a un determinado tipo de alimento:
1 >> goes for >> sweats
2 >> goes for >> drinks
and so on..
Ahora tiene una sola columna (no varias de ellas como en su modelo) Ahora puede tener un solo método DAO accediendo a cualquier tipo (que estaba solicitando)
@Query("SELECT * FROM Table_name WHERE :foodtype = type")
LiveData<List<Item>> getAllDrinks(int type) // add the type
Nota: También para Enum
facilitar la lectura, puede utilizar 's para sus campos y realizar la conversión del tipo de habitación.