Аргумент аннотации должен быть константой времени компиляции

я видел этот вопрос. Похожая ошибка, но в моем случае она другая.

Работая с Room, я создавал таблицу. он работал нормально.

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

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

@Delete
fun delete(user: User)}

но потом я обнаружил, что все имена таблиц должны храниться в другом классе. например, имя таблицы "пользователь" -> Хранится в другом классе.

Eg.

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

Но код ниже не работает. он не берет имя таблицы из класса Table. Выдает ошибку времени компиляции. «Аргумент аннотации должен быть константой времени компиляции», пожалуйста, помогите мне. Что в нем не так

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

comment
Почему отрицательная маркировка, я не понял. Что в этом нелогичного.   -  person Tarun    schedule 04.06.2018


Ответы (3)


Проблема в том, что указано в ошибке, у вас не может быть динамически определенных аргументов для вашей аннотации @Query. Если вы хотите определить имя таблицы где-нибудь еще, используйте конкатенацию строк. Сделать это можно так:

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

Вот как они это делают в этом пример Google.

person Levi Moreira    schedule 04.06.2018
comment
Но в koltin объединение строк выполняется с помощью символа $. когда я конвертирую вашу строку concat в код kotlin. это показало мне вот что. @Query (ВЫБРАТЬ * ИЗ $ {Table.USER_TABLE}) - person Tarun; 04.06.2018
comment
Я делал со знаком +, и он работал. github.com/Levi-Moreira/TeamManagerApp/blob/master/app/src/main/ Я предполагаю, что интерполяция котлина оценивается во время выполнения и может не работать должным образом с аргументами аннотации, которые необходимо оценивается во время компиляции. - person Levi Moreira; 04.06.2018

Вам нужно избежать конкатенации строк при использовании аннотации @Value с символом доллара в Kotlin (добавьте \ к $):

@Query("SELECT * FROM \$Table.USER_TABLE")
fun getAll(): List<User>
person floatingmuseum    schedule 20.04.2019

Вы должны определить имя столбца также в классе данных и доступе, если вы хотите использовать столбцы в запросах и получить к нему доступ с помощью этого метода:

@Query("SELECT * FROM ${Table.USER_TABLE}")
person Amir Hossein Ghasemi    schedule 05.12.2018
comment
это заканчивается той же проблемой - person IIRed-DeathII; 07.03.2020