Jak przekazać nazwę kolumny jako parametr w bazie danych pokoi? [duplikować]
Używam roomdatabase
i 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, int
to nie powinno być?
LiveData<List<Item>> getAllDrinks(int drinks)
Odpowiedzi
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:
- Model projektu bazy danych: Niezbyt dobry projekt bazy danych pod względem normalizacji danych ; czemu? Masz kolumnę dla
sweets
, inną dladrinks
, może jedną dlameals
... 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) - 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
Room
zapewnia ci abstrakcję,SQL queries
gdzie 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 int
i 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: Enum
aby zwiększyć czytelność, możesz użyć pól w polach i dokonać konwersji typu pokoju.