Annotation参数必须是编译时常量

时间:2018-06-04 10:38:40

标签: android kotlin android-room android-architecture-components android-jetpack

我看到了this个问题。类似的错误。但在我的情况下它是不同的。

与Room i合作时正在创建表格。它工作正常。

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

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

@Delete
fun delete(user: User)}

然后我发现所有表名必须存储在不同的类中。像表名“user” - &gt;存放在不同的班级。

例如

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

但是下面的代码不起作用。 它没有从Table类中获取表名。给编译时错误。 “Annotation参数必须是编译时间常数”请帮帮我。它有什么错误

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

3 个答案:

答案 0 :(得分:3)

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

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

这是他们在google示例中的表现方式。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

尝试在“ $”之前放置“ \”

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