Android Room按日期排序失败,求故障排查思路
为什么Room按日期排序失效?
你这里的问题核心出在查询语句里的date(date)函数用法错误,咱们一步步拆解原因:
- 你的
date字段通过TimestampConverter转换器,被转换成了Long类型的毫秒时间戳存储在数据库中,也就是说数据库里date列实际存的是一串数字(比如1699999999000)。 - 而SQLite的
date()函数是用来解析日期字符串(比如'2023-11-13')或者符合特定格式的时间值的,你把一个纯数字的时间戳传给它,它根本没法正确解析成有效日期,排序逻辑自然就失效了。
正确的解决方案
根据你的需求,分两种情况处理:
1. 按完整时间(包含时分秒)排序
既然数据库里存的是毫秒时间戳,它本身就是随时间递增的数值,直接按字段本身排序即可:
@get:Query("SELECT * FROM my_table ORDER BY date DESC") val all: LiveData<List<MyModel>>
这样降序排序后,最新的记录会排在最前面。
2. 按日期(忽略时分秒,只按年月日)排序
如果需要把同一天的记录归在一起排序,就需要把毫秒时间戳转换成日期格式再处理(注意要除以1000,因为Java的时间戳是毫秒级,SQLite的datetime()默认处理秒级时间戳):
@get:Query("SELECT * FROM my_table ORDER BY datetime(date / 1000, 'unixepoch') DESC") val all: LiveData<List<MyModel>>
内容的提问来源于stack exchange,提问作者Siegmeyer
相关产品推荐
相关产品推荐

