You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Room日期范围查询无结果但Database Inspector可正常返回数据的问题求助

问题分析与解决方案

嘿,我一眼就揪出你问题的核心了——参数顺序完全传反了!

先看你Repository里的这段代码:

fun readingsByDateRange(s: String, e: String): Flow<List<BPReading>> = bpReadingDao.getReadingsByDateRange(e, s)

你把传入的起始日期(s)和结束日期(e)反过来传给Dao的查询方法了!这直接导致所有范围查询的逻辑完全颠倒。

为什么会出现那些奇怪的现象?

  1. 用完整时间戳查询返回空列表:
    当你调用bpReadingsByDate("2021-09-18 00:00:00", "2021-09-18 23:59:59")时,Dao实际收到的参数是startDate="2021-09-18 23:59:59",endDate="2021-09-18 00:00:00"。SQL的BETWEEN要求左边的取值必须小于等于右边,反过来的话自然查不到任何数据。

  2. 用DATE()查单天有效,但跨天失效:

    • 查单天时,你传的两个参数都是"2021-09-18",哪怕顺序反了,DATE(timeStamp) BETWEEN '2021-09-18' AND '2021-09-18'依然能匹配当天的数据,所以看起来正常。
    • 但跨天传"2021-09-18"和"2021-09-19"时,Dao实际拿到的起始日期是2021-09-19,结束日期是2021-09-18,同样不符合BETWEEN的顺序要求,结果自然为空。

修复方法

只需要把Repository里的参数顺序修正过来就行:

fun readingsByDateRange(s: String, e: String): Flow<List<BPReading>> = bpReadingDao.getReadingsByDateRange(s, e)

额外优化建议

为了避免以后再踩这种低级坑,建议给参数起更清晰的命名,比如:

// Repository层
fun readingsByDateRange(startDate: String, endDate: String): Flow<List<BPReading>> = 
    bpReadingDao.getReadingsByDateRange(startDate, endDate)

// ViewModel层
fun bpReadingsByDate(startDate: String, endDate: String): LiveData<List<BPReading>> = 
    repository.readingsByDateRange(startDate, endDate).asLiveData()

这样一眼就能看懂每个参数的含义,再也不会搞混顺序了。

另外,修复参数顺序后,你最初用完整时间戳的Dao查询语句也能正常工作,不用再依赖DATE()函数来绕弯啦。

内容的提问来源于stack exchange,提问作者Team Chitoge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:07:48