Android Room数据库错误:在@Query函数中未使用的参数:days

5
我正在使用Room数据库,在我的Dao中尝试编写一个查询,该查询将删除所有早于特定天数的记录。这是我得出的代码:
 @Query("DELETE FROM my_table WHERE dateFrom <= date('now','-:days day')")
fun deleteAllOlderThan(days: Int)

然而,当我尝试构建我的项目时,在Gradle控制台中出现错误:

错误:未使用的参数:days

我正在使用Kotlin,因此它也向我显示了这个错误:

错误:执行任务 ':nexo:kaptDebugKotlin' 失败。 内部编译器错误。请查看日志以获取更多详细信息。

我的查询有什么问题吗? 更新 我还收到一个关于转换日期的错误。这是我的转换器:
class Converter {
@TypeConverter
fun fromTimestamp(value: Long?) = value?.let { Date(it) }

@TypeConverter
fun dateToTimestamp(date: Date?) = date?.time
}

我还会用注解将它添加到我的数据库中:

@TypeConverters(Converter::class)

这里是我收到的具体错误:

无法确定如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。 e: e:private final java.util.Date dateFrom = null;

摘要

  1. I was trying to use Converter with sealed class which in Room it causes problems, so i decided to keep my date parameter as Long.

  2. Check Emmanuel S answer. It should be:

    @Query("DELETE FROM my_table WHERE dateFrom <= date('now', '-' || :days || ' days')")
    fun deleteAllOlderThan(days: Int)
    

我怀疑你不能在引号字符串中使用:days。Room所做的就是围绕SQLite占位符进行包装。尝试使用字符串连接。 - CommonsWare
请发布您的数据库类.. :-) - Emanuel
@EmanuelS 我已经更新了,感谢你的帮助。 - K.Os
试过了,是因为这个类是密封类。将其改为开放类就可以解决问题了。https://github.com/googlesamples/android-architecture-components/issues/52 - Emanuel
仍然没有任何进展,我已经将其开放,并从LogEvent中删除了dateFrom变量,因此子类将不会覆盖它,现在它们只有这个作为自己的参数。错误仍然出现。 - K.Os
显示剩余8条评论
4个回答

11
我认为CW已经回答了你的问题:关于天数的问题。
你的天数必须被引用为字符串,例如:
"-20 days"


@Query("DELETE FROM my_table WHERE dateFrom <= date('now', :days)")
fun deleteAllOlderThan(days: String)

如果它不起作用,可以尝试使用concat函数。
请尝试以下操作:
@Query("DELETE FROM my_table WHERE dateFrom <= date('now', '-' || :days || ' days')")
fun deleteAllOlderThan(days: Int)

针对您的转换器问题,您可能需要使用

@TypeConverter
fun fromTimestamp(value: Long?) = value?.let { Date(it) }

@TypeConverter
fun dateToTimestamp(date: Date?) = date?.time 

这很好用。

不要使用伴生对象,只需使用

class DBConverters { 
    @TypeConverter
    fun fromTimestamp(value: Long?) = value?.let { Date(it) }

    @TypeConverter
    fun dateToTimestamp(date: Date?) = date?.time
}

将转换器添加到您的抽象 DB 类中,例如:

@TypeConverters(DBConverters::class)
abstract class YourDb : RoomDatabase() {}

我进行了更新,也许你现在可以帮忙了。我还使用了你的转换。 - K.Os
我进行了更新,但出现了错误:该类被引用为转换器,但它没有任何转换方法。 - K.Os
更新了我的回答。尝试使用concat函数。我不确定语法是否正确。 - Emanuel
很高兴我能帮到你。请更新你的问题并分享解决方案,以便帮助其他人 :-) - Emanuel
谢谢,目前我只是使用长整型调用此函数,以使其不复杂化。 - K.Os
显示剩余3条评论

7
在 @Query 字符串中,您需要在 "days" 前面放置一个 :

2

关于错误:未使用的参数:days

目前在使用Kotlin时,Room无法读取参数名称。尝试使用arg0或p0代替,例如:

 @Query("DELETE FROM my_table WHERE dateFrom <= date('now','-:arg0 day')")
 fun deleteAllOlderThan(days: Int)

这不是真的,在我的项目中,我只需要在@Query语句中在变量名前面放置:即可。 - Nick Mowen
这个 bug 已经在 Kotlin 的某个版本中修复了。不幸的是,我不知道具体是哪个版本,现在也无法检查... - Michał Powłoka

0

我通过添加来解决了这个问题

apply plugin: 'kotlin-kapt'

在应用程序模块的 build.gradle 文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接