Como passar o nome da coluna como parâmetro no banco de dados da sala? [duplicado]

Dec 11 2020

Estou usando roomdatabasee tenho muitas categorias 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();

Então a questão é: é possível fazer uma consulta universal e passar o nome da coluna como parâmetro? Por exemplo:

@Query("SELECT * FROM Table_name WHERE :columnname = drinks AND :columnname = 1")
LiveData<List<Item>> getAllDrinks(String drinks); 

Eu sei que me refiro ao columnName, mas se columnName for type int, não deveria ser?

LiveData<List<Item>> getAllDrinks(int drinks)

Respostas

Zain Dec 11 2020 at 22:23

Resposta curta: Você não pode fazer isso porque o SQLite não permite isso, verifique aqui .

Resposta longa:

Existem algumas desvantagens em seu modelo:

  1. Modelo de design de banco de dados: Não que seja um bom design de banco de dados em termos de normalização de dados ; porque? Você tem uma coluna para sweets, outra para drinks, talvez uma para meals.. Mais colunas significam mais armazenamento de dados, mais campos anuláveis ​​em registros e você precisa de um método de banco de dados para consultar cada coluna separadamente (como sua pergunta)
  2. Ter um nome de coluna variável pode estar sujeito a erros: e se você passar uma coluna que não existe no banco de dados .. Este é um dos recursos que Roomfornece a você mais abstrato, SQL queriesonde o Room fornece erros em tempo de compilação para nomes de coluna incorretos enquanto o SQLite normal os aumenta em tempo de execução.

O que eu encorajo você a fazer:

Crie uma única coluna que indique o tipo de alimento; para eficiência, você pode criá-lo do tipo inte mapear cada valor inteiro para um determinado tipo de alimento:

1 >> goes for >> sweats 
2 >> goes for >> drinks
and so on..

Agora você tem uma única coluna (não várias delas como em seu modelo) Agora você pode ter um único método DAO acessando qualquer tipo (o que você estava pedindo)

@Query("SELECT * FROM Table_name WHERE :foodtype = type")
LiveData<List<Item>> getAllDrinks(int type) // add the type

Observação: também para Enumfacilitar a leitura, você pode usar 's para seus campos e fazer a conversão de tipo de quarto.