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;
摘要
我试图将Converter与密封类一起使用,这在Room中会导致问题,因此我决定将date参数保留为Long。
检查伊曼纽尔S答案。它应该是:
@Query("DELETE FROM my_table WHERE dateFrom <= date('now', '-' || :days || ' days')")
fun deleteAllOlderThan(days: Int)
Run Code Online (Sandbox Code Playgroud)我认为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)