【问题标题】:how to get today ,past or future date data from room database in android?如何从 android 的房间数据库中获取今天、过去或未来的日期数据?
【发布时间】:2022-07-08 12:24:28
【问题描述】:

如何从安卓的房间数据库中获取今天、过去或未来的日期数据?

下面是模型类,有一个 task_date 字段是我使用 Date 对象获取的。

模型类

    @Entity
data class Task(
    @PrimaryKey
    val tid: Long?,
    @ColumnInfo(name = "title") val title: String?,
    @ColumnInfo(name = "task_date") val task_date: Date?,
    @ColumnInfo(name = "task_hour") val task_hour: Int?,
    @ColumnInfo(name = "task_minute") val task_minute: Int?,
    @ColumnInfo(name = "task_cat") val task_cat: String?,
    @ColumnInfo(name = "task_repeat") val task_repeat: String?,
) {
    override fun toString(): String {
        return "Task(tid=$tid, title=$title, task_date=$task_date, task_hour=$task_hour, task_minute=$task_minute, task_cat=$task_cat, task_repeat=$task_repeat)"
    }
}

下面有查询代码

我正在传递 Date() 今天的日期来获取今天插入的数据列表

 @Query("SELECT * FROM task WHERE task_date = :targetDate")
fun getUpcomingTask(targetDate: Date): List<Task>

数据插入代码在这里

  val task = Task(
                        Utils.getUniqueId(),
                        bindingActivity.inputTaskTitle.text.toString(),
                        Date(),
                        selectedHour, selectedMinute,
                        bindingActivity.mySpinnerDropdown.text.toString(),
                        Constant.REPEAT.NONE
                    )

转换器类

class Converters {

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

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

}

最后一个DataBase类

 @Database(entities = [Task::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
    abstract fun taskDao(): TaskDao
}

我展示了我从未使用过日期对象的代码实现 所以需要你的帮助来学习这个日期的实现此外,我也 想要检索即将到来的数据和过去的数据等数据。也请 给你宝贵的建议,以了解更多日期

.

谢谢。

【问题讨论】:

  • 我会使用 Long 来表示数据库中的日期(自 UTC 纪元以来的 Millis)。更容易比较和转换为其他格式。使用三列来存储一个时间是很麻烦的。

标签: android database kotlin android-room


【解决方案1】:

由于将日期转换为长日期,您的问题在于存储和传递的确切内容。

这是 long 精确到毫秒,因此当查询等于“日期”的任务时,它不知道您只想要日期部分,因此几乎不可能获得非常毫秒。

考虑以下 3 个任务的数据(基于使用您的代码),它看起来像:-

  • 忽略除 task_date 列之外的所有列
  • 所有 3 行是在 2022 年 7 月 8 日 14:10 后立即插入的,但它们都有不同的值,因为值包括毫秒。

所以SELECT * FROM task WHERE task_date = :targetDate 可能永远不会得到任何记录。

今天

但是考虑一下这个查询SELECT * FROM task WHERE task_date / (1000 /* drop millis*/ * 60 /* drop seconds */ * 60 /* drop minutes */ * 24 /* drop hours */) = :targetDate / 86400000

  • 注意 cmets 解释了 86400000 是如何得出的(它是应用于比较两边的相同值)。即从存储的 long 值中删除除日期之外的所有日期。

未来与过去

对于未来和过去,毫秒无关紧要,因此您可以使用SELECT * FROM task WHERE task_date &gt; :targetDate(未来)和SELECT * FROM task WHERE task_date &lt; :targetDate(过去)

【讨论】:

    【解决方案2】:

    您将转换器用于Date,这意味着它将转换为Long 并以 Long 形式存储在您的数据库中。话虽如此,您可以在 sql 查询中使用 &gt;, &lt; 运算符。例如

    过去

    @Query("SELECT * FROM task WHERE task_date < :date")
    fun getPastTasks(date: Date): List<Task>
    

    未来

    @Query("SELECT * FROM task WHERE task_date > :date")
    fun getFutureTasks(date: Date): List<Task>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-22
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多