Widziałem to pytanie. Podobny błąd.But w moim przypadku jest inny.

Podczas pracy z pokojem tworzyłem stół. Pracowała dobrze.

@Daointerface 
UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(user: User)

@Delete
fun delete(user: User)}

Ale potem znalazłem wszystkie nazwy tabel musi być przechowywane w innej klasie. Jak nazwa tabeli "Użytkownik" -> przechowywany w innej klasie.

Na przykład.

class Table {
companion object {
    const val USER_TABLE = "user"
}}

Ale poniżej kodu nie działa. Nie odbiera nazwy tabeli z klasy tabeli. Dając błąd czasu kompilacji . "Argument adnotacji musi być stałą kompilacyjną" proszę mi pomóc. Co w nim

@Query("SELECT * FROM $Table.USER_TABLE")
fun getAll(): List<User>
13
Tarun 4 czerwiec 2018, 13:38

3 odpowiedzi

Najlepsza odpowiedź

Problemem jest ten, który podany jest w błędzie, nie możesz mieć dynamicznie zdefiniowanych argumentów dla adnotacji @Query. Jeśli chcesz zdefiniować nazwę stołu gdzieś indziej, użyj konkatenacji ciągów. Możesz to zrobić w ten sposób:

@Query("SELECT * FROM " + Table.USER_TABLE)
fun getAll(): List<User>

W ten sposób robią to w tym Google próbka.

6
Levi Moreira 4 czerwiec 2018, 11:14

Musisz uciec od konkatenacji ciągów, przy użyciu adnotacji @Value za pomocą symbolu dolara w Kotlinie (Prepend \ do {x1}}):

@Query("SELECT * FROM \$Table.USER_TABLE")
fun getAll(): List<User>
4
U-ways 22 październik 2019, 18:23

Powinieneś zdefiniować nazwę kolumny również w klasie danych i dostęp, jeśli chcesz używać kolumn w zapytaniach i dostęp do niego za pomocą tej metody:

@Query("SELECT * FROM ${Table.USER_TABLE}")
1
Amir Hossein Ghasemi 5 grudzień 2018, 14:42