Jak przekazać nazwę kolumny jako parametr w bazie danych pokoi? [duplikować]

Dec 11 2020

Używam roomdatabasei mam wiele kategorii do przeszukiwania.

@Query("SELECT * FROM Table_name WHERE sweets = 1")
LiveData<List<Item>> getAllSweets();

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

Pytanie brzmi, czy można wykonać jedno uniwersalne zapytanie i przekazać nazwę kolumny jako parametr? Na przykład:

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

Wiem, że odwołuję się do columnName, ale jeśli columnName jest typem, intto nie powinno być?

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

Odpowiedzi

Zain Dec 11 2020 at 22:23

Krótka odpowiedź: Nie możesz tego zrobić, ponieważ SQLite na to nie zezwala, sprawdź tutaj .

Długa odpowiedź:

Twój model ma kilka wad:

  1. Model projektu bazy danych: Niezbyt dobry projekt bazy danych pod względem normalizacji danych ; czemu? Masz kolumnę dla sweets, inną dla drinks, może jedną dla meals... Więcej kolumn oznacza więcej miejsca na dane, więcej pól w rekordach z możliwością zerowania i potrzebujesz metody bazy danych do odpytywania każdej kolumny osobno (tak jak to, o co pytasz)
  2. Posiadanie zmiennej nazwy kolumny może być podatne na błędy: co się stanie, jeśli przekażesz kolumnę, która nie istnieje w bazie danych. Jest to jedna z funkcji, która Roomzapewnia ci abstrakcję, SQL queriesgdzie Room zapewnia błędy czasu kompilacji dla nieprawidłowe nazwy kolumn, podczas gdy normalny SQLite podnosi je w czasie wykonywania.

Do czego zachęcam:

Utwórz jedną kolumnę, która wskazuje rodzaj żywności; aby zwiększyć wydajność, możesz utworzyć go typu inti zmapować każdą wartość całkowitą do określonego rodzaju żywności:

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

Teraz masz pojedynczą kolumnę (nie jest ich wiele, jak w twoim modelu) Teraz możesz mieć jedną metodę DAO uzyskującą dostęp do dowolnego typu (o który prosiłeś)

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

Uwaga: Enumaby zwiększyć czytelność, możesz użyć pól w polach i dokonać konwersji typu pokoju.