Flutter SQLite插入时数据类型不匹配,字段类型正确仍报错如何解决
SQLite插入类型不匹配报错解决方案
问题根因排查
你遇到的SQLITE_MISMATCH类型不匹配报错,在当前代码场景下大概率是以下两个问题导致:
- 旧表结构未更新:你修改建表语句后,没有删除设备本地已存在的旧数据库文件,实际运行的表结构还是修改前的版本。比如之前的
Profile表存在INTEGER类型的自增主键、或者某个字段之前定义为非TEXT类型,修改建表语句后没有触发表结构更新,就会出现类型不匹配。
修复方法:直接卸载APP重装(清除本地数据库缓存),或者在数据库版本升级逻辑中添加删除旧表、重新建表的代码即可验证。 - SQL字符串拼接语法错误:你现在直接用字符串插值拼接SQL的写法存在漏洞,如果任意输入字段包含单引号(比如用户输入姓名为
张'三),会直接打断SQL的引号结构,导致语法解析错误被误判为类型不匹配,同时还有SQL注入风险。
修复方法:改用参数化查询写法,不要手动拼接SQL字符串:
如果要使用自定义查询方法,也请用占位符传参:// 适配sqflite库的参数化插入示例 DBProvider.db.insert( "Profile", { "mac": profile[0].mac, "image": profile[0].image, "name": profile[0].name, "age": profile[0].age, "nationality": profile[0].nationality, "profession": profile[0].profession, "about": profile[0].about } );DBProvider.db.customQuery( "INSERT Into Profile (mac,image,name,age,nationality,profession,about) VALUES (?,?,?,?,?,?,?)", [ profile[0].mac, profile[0].image, profile[0].name, profile[0].age, profile[0].nationality, profile[0].profession, profile[0].about ] );
表结构验证方法
如果以上操作后仍报错,可以执行如下SQL查看实际运行的表结构,确认所有字段类型是否符合预期:
PRAGMA table_info(Profile);
打印返回结果即可看到每个字段的实际类型定义,快速定位不匹配的字段。
内容的提问来源于stack exchange,提问作者Jay Gunawardena
相关产品推荐
相关产品推荐

