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

Android SQLite替代SQL查询执行遇语法错误,寻求解决方法

问题解决:Android SQLite语法错误及查询修正

错误分析

从报错信息和你的SQL代码来看,存在以下几个关键问题:

  1. 语法缺失:逻辑运算符遗漏
    最后一个OR条件中,endDate='0'后直接跟括号,缺少AND连接后续条件,导致SQL解析失败。

  2. 日期值未加引号
    替换后的日期2022-11-29未用单引号包裹,SQL会将其解析为数值减法运算(2022-11-29=1982),既不符合日期格式,也会导致类型不匹配。

  3. 数值与字符串错误比较
    takenDate和endDate是LONG类型,你用了字符串'0'进行比较,应该直接使用数字0。

  4. 原查询逻辑遗漏
    未保留原SQL中OR @SelecctedDate IS NULL的条件,导致当日期变量为空时无法匹配数据。

  5. 字段替换偏差
    原SQL最后一个条件使用createdTime,但你的Android查询中换成了lastUpdateDate,若为笔误需修正回createdTime。

修正后的Android SQLite查询

SELECT * FROM $table 
WHERE (
    (($selectedDate >= strftime('%Y-%m-%d', takenDate/1000, 'unixepoch') AND takenDate != 0)
        AND ($selectedDate <= strftime('%Y-%m-%d', endDate/1000, 'unixepoch') AND endDate != 0))
    OR (($selectedDate = strftime('%Y-%m-%d', takenDate/1000, 'unixepoch') AND takenDate != 0) AND endDate = 0)
    OR (takenDate = 0 AND ($selectedDate = strftime('%Y-%m-%d', endDate/1000, 'unixepoch') AND endDate != 0))
    OR (takenDate = 0 AND endDate = 0 AND ($selectedDate = strftime('%Y-%m-%d', createdTime/1000, 'unixepoch')))
    OR $selectedDate IS NULL
)

额外注意事项

  • 确保$selectedDate替换后是带单引号的日期字符串,比如'2022-11-30',而不是裸数值。
  • 若createdTime确实需要替换为lastUpdateDate,可根据业务需求调整,但需保证字段类型是可转换为时间戳的数值。

内容的提问来源于stack exchange,提问作者Rabindra Acharya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:40:29