注释参数必须是编译时常量

An Annotation argument must be a compile time constant

我看到了问题。类似 error.But 在我的情况下它是不同的。

在使用 Room 时,我正在创建 table。它工作正常。

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

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

@Delete
fun delete(user: User)}

但后来我发现所有 table 名称必须存储在不同的 class 中。 like table name "user" -> 存储在不同的 class.

例如

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

但是下面的代码不起作用。 它没有从 Table class 中获取 table 名称。给出编译时错误 。 "An Annotation argument must be a compile time constant"请大家帮帮我out.What错在哪

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

问题出在错误中,您不能为 @Query 注释动态定义参数。如果要在其他地方定义 table 的名称,请使用字符串连接。你可以这样做:

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

他们在这个 google 示例中就是这样做的。

如果您想在查询中使用列并通过此方法访问它,您还应该在数据 class 和访问中定义列名:

@Query("SELECT * FROM ${Table.USER_TABLE}")

在 Kotlin 中使用带有美元符号的 @Value 注释时需要转义字符串连接(将 \ 添加到 $):

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