24

我见过这个问题。类似的错误。但在我的情况下它是不同的。

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

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

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

@Delete
fun delete(user: User)}

但后来我发现所有表名都必须存储在不同的类中。像表名“用户”-> 存储在不同的类中。

例如。

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

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

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

3 回答 3

10

@Value在 Kotlin 中使用带有美元符号的注释时,您需要转义字符串连接(\前置)$

@Query("SELECT * FROM \$Table.USER_TABLE")
fun getAll(): List<User>
于 2019-04-20T17:31:07.520 回答
6

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

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

这就是他们在这个谷歌示例中的做法。

于 2018-06-04T11:14:33.677 回答
3

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

@Query("SELECT * FROM ${Table.USER_TABLE}")
于 2018-12-05T14:42:58.500 回答