Android Kotlin中将MySQL查询转为Room查询无if函数报错如何解决
问题原因
- 报错核心原因是Room底层使用的SQLite数据库不支持MySQL原生的
IF()函数 - 另外你使用
datetime()函数做日期格式化的用法也不符合SQLite语法规范,会导致日期输出结果不符合预期
解决方案
1. 替换IF函数
将所有IF(字段 IS NULL, 0, 字段)逻辑替换为SQLite原生支持的IFNULL(字段, 0),二者逻辑完全等效:如果字段值为NULL则返回0,否则返回字段本身的值。
2. 替换日期格式化函数
SQLite中需要使用strftime(格式, 日期字段)函数实现日期格式化,替换原来的datetime()用法。
修改后的完整代码
@Query("SELECT strftime('%d-%b', timeStamp) AS date, " + "strftime('%d', timeStamp) AS dateNumber, " + "ROUND(AVG(IFNULL(stateOfCharge, 0)), 2) AS chargeOverTime, " + "ROUND(AVG(IFNULL(temperature, 0)), 2) AS temperature, " + "ROUND(AVG(IFNULL(current, 0)), 2) AS averageChargeDischarge " + "FROM " + DatabaseConstant.mUserBatteryDetailsTable + " WHERE name= :batteryId and timeStamp between :startDate AND :endDate " + "GROUP BY strftime('%Y-%m-%d', timeStamp) ORDER BY timeStamp") suspend fun getHistoryData(batteryId: String, startDate: String, endDate: String): List<BatteryDetails>?
额外注意事项
- 如果你存储的
timeStamp是毫秒级时间戳,需要先转换成秒级再传入strftime函数,对应写法为strftime('%d-%b', timeStamp/1000, 'unixepoch') - SQLite默认
%b输出的是英文月份缩写,如果需要匹配中文本地化格式,需要额外做转换处理
内容的提问来源于stack exchange,提问作者Jaimin Modi
相关产品推荐
相关产品推荐

