Comment passer le nom de la colonne en tant que paramètre dans la base de données de la salle? [dupliquer]
J'utilise roomdatabase
et j'ai beaucoup de catégories à interroger.
@Query("SELECT * FROM Table_name WHERE sweets = 1")
LiveData<List<Item>> getAllSweets();
@Query("SELECT * FROM Table_name WHERE drinks = 1")
LiveData<List<Item>> getAllDrinks();
La question est donc: il est possible de créer une requête universelle et de passer le nom de la colonne en paramètre? Par exemple:
@Query("SELECT * FROM Table_name WHERE :columnname = drinks AND :columnname = 1")
LiveData<List<Item>> getAllDrinks(String drinks);
Je sais que je fais référence au columnName mais si columnName est de type, int
il ne devrait pas l'être?
LiveData<List<Item>> getAllDrinks(int drinks)
Réponses
Réponse courte: Vous ne pouvez pas faire cela car SQLite ne le permet pas, vérifiez ici .
Longue réponse:
Il y a quelques inconvénients dans votre modèle:
- Modèle de conception de base de données: pas qu'une bonne conception de base de données en termes de normalisation des données ; Pourquoi? Vous avez une colonne pour
sweets
, une autre pourdrinks
, peut-être une pourmeals
.. Plus de colonnes, signifie plus de stockage de données, plus de champs Nulls dans les enregistrements, et vous avez besoin d'une méthode de base de données pour interroger chaque colonne séparément (comme sur quoi porte votre question) - Avoir un nom de colonne variable peut être sujet à des erreurs: que se passe-t-il si vous passez dans une colonne qui n'existe pas dans la base de données? C'est l'une des fonctionnalités qui
Room
vousSQL queries
offre un résumé où Room vous fournit des erreurs de compilation pour des noms de colonne incorrects alors que SQLite normal les lève au Runtime.
Ce que je vous encourage à faire:
Créez une seule colonne qui indique le type de nourriture; pour plus d'efficacité, vous pouvez le créer de type int
et mapper chaque valeur entière à un certain type d'aliment:
1 >> goes for >> sweats
2 >> goes for >> drinks
and so on..
Maintenant vous avez une seule colonne (pas plusieurs comme dans votre modèle) Vous pouvez maintenant avoir une seule méthode DAO accédant à n'importe quel type (que vous demandiez)
@Query("SELECT * FROM Table_name WHERE :foodtype = type")
LiveData<List<Item>> getAllDrinks(int type) // add the type
Remarque: Pour plus de lisibilité, vous pouvez également utiliser Enum
des s pour vos champs et effectuer une conversion de type de pièce.