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,虽不直接影响构建,但会提升后续代码维护的排查成本。
- 布尔类型字段
修复方案
- 转义默认值中的单引号:SQL语法中字符串内部的单引号需要用连续两个单引号转义,既可以把
description的默认值调整为转义后的合法写法,也可以直接替换为不含单引号的表述,从根源避免SQL拼接错误。 - 修正布尔字段的默认值:把
isDone字段的默认值从"false"改为对应整型值的"0",匹配Room对布尔值的存储映射规则。 - 修正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
相关产品推荐
相关产品推荐

