如何将此 UserDao 与日期一起使用?

How to use this UserDao with Date?

我正在尝试做的应用是基于从房间数据库中检索当天、星期和月份的数据,所以我的实体只包含 ID 和日期, 但在一个较老的问题中有这样的答案:

日期转换器:

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

    @TypeConverter
    fun dateToTimestamp(date: Date?): Long? {
        return date?.time?.toLong()
    }

用户道:

@Dao
interface UserDao {
    @Query("SELECT * FROM user WHERE birthday BETWEEN :from AND :to")
    fun findUsersBornBetweenDates(from: Date, to: Date): List<User>
}

当我使用它时,我不知道 (from: Date, to: Date) 在日期中放入什么并检索数据。 是否有任何我错过的在线教程或帮助可能对我有帮助?

我正在努力学习和理解数据库和日期的工作原理,所以任何帮助都很重要。

问题是 ROOM 不能直接理解 Date 这就是为什么您必须使用类型转换器的原因。您的类型转换器是 Long,因此您将 Long 作为 Date 存储在数据库中。所以你在那里做的是写: select 从这个 Long 等于 Date 到另一个 Long 等于 Date。房间不知道怎么办。

您必须在查询中传递 Long,它才会起作用。你可以这样做:


@Transaction
fun findUsersBornBetweenDates(from: Date, to: Date): List<User> {
    //convert dates to long
    return findUsersBornBetweenDates(fromLong, toLong)
}

@Query("SELECT * FROM user WHERE birthday BETWEEN :from AND :to")
fun findUsersBornBetweenDates(from: Long, to: Long): List<User>

@Transaction 的注意事项是它不适用于 LiveData,因此您必须在达到 [=18] 之前将 Date 转换为 Long =].

解决这个问题的一个很常见的方法是重新利用 fromTimestampdateToTimestamp

如果您真的想查看您的数据库存储了什么,我建议您使用 Android Studio 上的 App Inspection 工具。是一个集成的数据库检查器,允许您查看表并执行 SQL 语句。这样你就可以直接看到数据库中日期的实际值是多少。