Annotation 参数必须是编译时间常数

Posted

技术标签:

【中文标题】Annotation 参数必须是编译时间常数【英文标题】:An Annotation argument must be a compile time constant 【发布时间】:2018-11-13 16:13:30 【问题描述】:

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

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

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

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

@Delete
fun delete(user: User)

但后来我发现所有表名都必须存储在不同的类中。比如表名“user”——>存储在不同的类中。

例如。

class Table 
companion object 
    const val USER_TABLE = "user"

但下面的代码不起作用。 它没有从 Table 类中获取表名。给出编译时错误。 “Annotation argument must be a compile time constant”请帮帮我。有什么问题

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

【问题讨论】:

为什么是负面标记,我不明白。有什么不合逻辑的。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

但在 koltin 中,字符串连接是使用“$ 符号”完成的。当我将您的 concat 字符串转换为 kotlin 代码时。它向我展示了这样的。 @Query("""SELECT * FROM $Table.USER_TABLE""") 我一直在使用 + 号,它一直在工作。 github.com/Levi-Moreira/TeamManagerApp/blob/master/app/src/main/… 我的猜测是 kotlin 插值是在运行时评估的,它可能无法与需要在编译时评估的注释参数一起正常工作。【参考方案3】:

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

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

【讨论】:

这最终出现在同一个问题中

以上是关于Annotation 参数必须是编译时间常数的主要内容,如果未能解决你的问题,请参考以下文章

使用注解校验参数

C语言编译、连接的各种错误

Java Annotation 应用 -- 导出Excel表格

java注解

Annotation注解

检查布尔模板参数时摆脱“条件表达式为常数”警告的方法?