You need to enable JavaScript to run this app. Android Room构建应用报SQLITE_ERROR near 't'语法错误如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Android Room构建应用报SQLITE_ERROR near 't'语法错误如何解决?

问题根因
  • 直接触发SQL语法错误的核心原因,是实体类中description字段的默认值存在未转义的单引号,导致Room拼接的建表SQL不符合语法规则。
    你设置的description默认值是"Doesn't have any description!",字符串内部的单引号没有做SQL转义。Room生成建表语句时,会用单引号把默认值包裹成合法的SQL字符串片段,这个未转义的单引号会直接提前闭合字符串边界,后续紧跟着的t字符就成了游离在SQL语法外的无效元素,和报错提示的near "t": syntax error完全对应。
  • 代码中还存在两个会引发后续构建/运行问题的隐患:
    • 布尔类型字段mIsDone的默认值写法不符合Room与SQLite的存储规则。SQLite没有原生BOOLEAN类型,Room对布尔值的映射规则是存储为整型值(0对应false,1对应true),你当前写的默认值是字符串"false",即使解决了单引号的语法问题,后续也会触发类型不匹配的报错。
    • DAO类存在命名笔误:将TaskDao错写为TackDao,虽不直接影响构建,但会提升后续代码维护的排查成本。
修复方案
  1. 转义默认值中的单引号:SQL语法中字符串内部的单引号需要用连续两个单引号转义,既可以把description的默认值调整为转义后的合法写法,也可以直接替换为不含单引号的表述,从根源避免SQL拼接错误。
  2. 修正布尔字段的默认值:把isDone字段的默认值从"false"改为对应整型值的"0",匹配Room对布尔值的存储映射规则。
  3. 修正DAO类的命名笔误,将TackDao重命名为TaskDao,同步更新MainDB类中对应抽象方法的返回值类型。

修改后的核心实体类代码参考:

@ColumnInfo(
        name = "description",
        defaultValue = "Doesn''t have any description!"
)
private String mDescription;

@ColumnInfo(
        name = "isDone",
        defaultValue = "0"
)
private boolean mIsDone;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 16:15:05