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

K.O*_*.Os 3 sqlite android kotlin android-room

我正在使用Room数据库,试图在我的Dao中编写查询,这将删除所有早于特定天数的记录。这就是我要说的:

 @Query("DELETE FROM my_table WHERE dateFrom <= date('now','-:days day')")
fun deleteAllOlderThan(days: Int)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试构建项目时,我的Gradle控制台出现错误:

错误:未使用的参数:天

我正在使用Kotlin,因此它也向我显示了这一点:

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

查询有什么问题?

更新

我也收到有关转换日期的错误。这是我的转换器:

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

@TypeConverter
fun dateToTimestamp(date: Date?) = date?.time
}
Run Code Online (Sandbox Code Playgroud)

我还将它添加到带有注释的数据库中:

@TypeConverters(Converter::class)
Run Code Online (Sandbox Code Playgroud)

这是我得到的特定错误:

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

摘要

  1. 我试图将Converter与密封类一起使用,这在Room中会导致问题,因此我决定将date参数保留为Long。

  2. 检查伊曼纽尔S答案。它应该是:

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

Ema*_*l S 6

我认为CW已经为您提供了答案:天数问题。

您的日子必须以类似字符串的形式引用

"-20 days"


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

如果不起作用,concat可能会有所帮助。

尝试:

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

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

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

@TypeConverter
fun dateToTimestamp(date: Date?) = date?.time 
Run Code Online (Sandbox Code Playgroud)

效果很好。

不要使用同伴对象。只需使用

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

    @TypeConverter
    fun dateToTimestamp(date: Date?) = date?.time
}
Run Code Online (Sandbox Code Playgroud)

并将Converter添加到您的抽象DB类中,例如

@TypeConverters(DBConverters::class)
abstract class YourDb : RoomDatabase() {}
Run Code Online (Sandbox Code Playgroud)


Nic*_*wen 6

在@Query 字符串中,您需要:在几天前放置