Wie übergebe ich den Spaltennamen als Parameter in der Raumdatenbank? [Duplikat]
Ich benutze roomdatabase
und ich habe viele Kategorien zum Abfragen.
@Query("SELECT * FROM Table_name WHERE sweets = 1")
LiveData<List<Item>> getAllSweets();
@Query("SELECT * FROM Table_name WHERE drinks = 1")
LiveData<List<Item>> getAllDrinks();
Die Frage ist also, ob es möglich ist, eine universelle Abfrage durchzuführen und den Spaltennamen als Parameter zu übergeben. Zum Beispiel:
@Query("SELECT * FROM Table_name WHERE :columnname = drinks AND :columnname = 1")
LiveData<List<Item>> getAllDrinks(String drinks);
Ich weiß, dass ich mich auf den Spaltennamen beziehe, aber wenn Spaltenname vom Typ ist int
, sollte es nicht sein?
LiveData<List<Item>> getAllDrinks(int drinks)
Antworten
Kurze Antwort: Sie können das nicht tun, weil SQLite das nicht zulässt. Überprüfen Sie dies hier .
Lange Antwort:
Ihr Modell weist einige Nachteile auf:
- Datenbankdesignmodell: Nicht, dass ein gutes Datenbankdesign im Hinblick auf die Datennormalisierung gut wäre ; Warum? Sie haben eine Spalte für
sweets
, eine andere fürdrinks
, vielleicht eine fürmeals
... Mehr Spalten, bedeutet mehr Datenspeicherung, mehr nullfähige Felder in Datensätzen, und Sie benötigen eine Datenbankmethode, um jede Spalte einzeln abzufragen (wie Ihre Frage) - Ein variabler Spaltenname kann fehleranfällig sein: Was passiert, wenn Sie eine Spalte übergeben, die nicht in der Datenbank vorhanden ist? Dies ist eine der Funktionen,
Room
die Sie über Abstract bereitstellen,SQL queries
für die Room Ihnen Fehler bei der Kompilierung bereitstellt falsche Spaltennamen, während normales SQLite sie zur Laufzeit auslöst.
Was ich Sie ermutige zu tun:
Erstellen Sie eine einzelne Spalte, die die Art des Lebensmittels angibt. Aus Gründen der Effizienz können Sie einen Typ erstellen int
und jeden ganzzahligen Wert einer bestimmten Art von Lebensmittel zuordnen:
1 >> goes for >> sweats
2 >> goes for >> drinks
and so on..
Jetzt haben Sie eine einzelne Spalte (nicht mehrere wie in Ihrem Modell). Jetzt können Sie eine einzelne DAO-Methode haben, die auf jeden Typ zugreift (nach dem Sie gefragt haben).
@Query("SELECT * FROM Table_name WHERE :foodtype = type")
LiveData<List<Item>> getAllDrinks(int type) // add the type
Hinweis: Aus Gründen der Lesbarkeit können Sie auch die Enum
für Ihre Felder verwenden und die Konvertierung des Raumtyps durchführen.