Android Room日期范围查询无结果但Database Inspector可正常返回数据的问题求助
问题分析与解决方案
嘿,我一眼就揪出你问题的核心了——参数顺序完全传反了!
先看你Repository里的这段代码:
fun readingsByDateRange(s: String, e: String): Flow<List<BPReading>> = bpReadingDao.getReadingsByDateRange(e, s)
你把传入的起始日期(s)和结束日期(e)反过来传给Dao的查询方法了!这直接导致所有范围查询的逻辑完全颠倒。
为什么会出现那些奇怪的现象?
用完整时间戳查询返回空列表:
当你调用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要求左边的取值必须小于等于右边,反过来的话自然查不到任何数据。用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
相关产品推荐
相关产品推荐

