【问题标题】:How to use this UserDao with Date?如何将此 UserDao 与 Date 一起使用?
【发布时间】:2021-11-15 12:53:59
【问题描述】:

我正在尝试做的应用程序是基于从房间数据库中检索当前日期、星期和月份数据,所以我的实体只包含 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) 中输入什么内容并检索数据。 是否有任何我错过的在线教程或任何帮助,并且可能对我有所帮助?

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

【问题讨论】:

  • 你有用户实体的日期转换器吗?
  • @cutiko 是的,我有,每个数据都成功进入数据库
  • 您可以将日期转换器添加到问题中吗?
  • @cutiko 我做到了
  • retrieving current day, week and month data from room database 为什么要从数据库中检索当前日期?

标签: android kotlin android-room kotlin-android-extensions android-date


【解决方案1】:

问题是 ROOM 不能直接理解Date,这就是你必须使用类型转换器的原因。您的类型转换器是 Long,因此您已将 Long 作为 Date 存储在 DB 中。所以你正在做的是写:从这个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,因此您必须在到达DAO 之前将您的Date 转换为Long

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

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

【讨论】:

  • 感谢您的帮助!日期到长的转换,日期必须是字符串?
  • 为什么日期必须是字符串?它在你的转换器中很长
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多