Wie übergebe ich den Spaltennamen als Parameter in der Raumdatenbank? [Duplikat]

Dec 11 2020

Ich benutze roomdatabaseund 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

Zain Dec 11 2020 at 22:23

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:

  1. 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ür drinks, vielleicht eine für meals... 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)
  2. 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, Roomdie Sie über Abstract bereitstellen, SQL queriesfü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 intund 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 Enumfür Ihre Felder verwenden und die Konvertierung des Raumtyps durchführen.