KMM项目使用SQLDelight将ID改为Text类型后插入报类型不匹配错误
SQLDelight TEXT类型主键插入datatype mismatch问题解决方案
核心报错原因
你遇到的datatype mismatch错误大概率来自两类场景:
- 表结构改完后,Kotlin侧调用插入方法时仍然传入Int类型的id值,和字段要求的TEXT(String)类型不匹配
- 仅修改了
.sq文件中的表定义语句,没有配置对应的数据库迁移脚本,用户设备上留存的旧版本表结构id字段仍为Int类型
排查&解决步骤
- 第一步:核对SQLDelight生成的插入方法参数
改完.sq文件的表结构后,先执行项目的generateSqlDelightInterfaceGradle任务,重新生成数据库操作接口,确认生成的insertSidework方法第一个id参数类型为String,如果仍然是Int需要同步清理构建缓存后重新生成。 - 第二步:补全数据库迁移脚本
SQLite不支持直接修改已有字段的类型,需要按以下流程写版本迁移脚本(假设你之前的数据库版本号为1,升级后为2):- 在SQLDelight的迁移文件目录下新建
1.sqm文件,写入以下内容:
-- 重命名旧表 ALTER TABLE sidework_Entity RENAME TO sidework_Entity_old; -- 新建最新结构的表 CREATE TABLE sidework_Entity( id TEXT NOT NULL PRIMARY KEY, name TEXT NOT NULL, employees TEXT NOT NULL, todoToday INTEGER AS Boolean DEFAULT 0 ); -- 迁移旧数据,把旧的Int类型id转为String存入新表 INSERT INTO sidework_Entity(id, name, employees, todoToday) SELECT CAST(id AS TEXT), name, employees, todoToday FROM sidework_Entity_old; -- 删除旧表 DROP TABLE sidework_Entity_old;- 同步修改数据库初始化时的版本号为2,确保App启动时会执行迁移脚本。
- 在SQLDelight的迁移文件目录下新建
- 第三步:核对插入时的id赋值逻辑
原来Int类型主键如果开启了自增特性,换成TEXT类型主键后SQLite不会自动生成id,需要手动传入全局唯一的字符串(比如UUID生成的字符串),不要继续传入Int类型的数值或者空值。
小概率问题排查
如果以上操作都做了还是报错,检查数据库初始化时的字段Adapter配置,确认有没有给id字段错误配置了Int类型的适配器,导致String类型的id被转成Int存入数据库。
内容的提问来源于stack exchange,提问作者barryalan2633
相关产品推荐
相关产品推荐

