我正在使用 Room 数据库,试图在我的 Dao 中编写一个查询,这将删除所有超过特定天数的记录。这是我的结论:
@Query("DELETE FROM my_table WHERE dateFrom <= date('now','-:days day')")
fun deleteAllOlderThan(days: Int)
但是,当我尝试构建我的项目时,我的 Gradle 控制台出现错误:
error: Unused parameter: days
我使用的是 Kotlin,所以它也向我展示了这个:
Error:Execution failed for task ':nexo:kaptDebugKotlin'. Internal compiler error. See log for more details
我的查询有什么问题?
更新
我也收到有关转换日期的错误。这是我的转换器:
class Converter {
@TypeConverter
fun fromTimestamp(value: Long?) = value?.let { Date(it) }
@TypeConverter
fun dateToTimestamp(date: Date?) = date?.time
}
我还通过注释将它添加到我的数据库中:
@TypeConverters(Converter::class)
这是我得到的具体错误:
Cannot figure out how to save this field into database. You can consider adding a type converter for it. e: e:private final java.util.Date dateFrom = null;
总结
我试图将 Converter 与密封类一起使用,这在 Room 中会导致问题,因此我决定将我的日期参数保留为 Long。
检查 Emmanuel S 的回答。应该是:
@Query("DELETE FROM my_table WHERE dateFrom <= date('now', '-' || :days || ' days')") fun deleteAllOlderThan(days: Int)
最佳答案
我认为 CW 已经为您的:days 问题给出了答案。
你的日子必须像字符串一样被引用
"-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
}
并将转换器添加到您的抽象数据库类中
@TypeConverters(DBConverters::class)
abstract class YourDb : RoomDatabase() {}
关于Android 房间数据库错误 : Unused parameter: days in @Query function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46747457/