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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 04:06:10