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

KMM项目使用SQLDelight将ID改为Text类型后插入报类型不匹配错误

SQLDelight TEXT类型主键插入datatype mismatch问题解决方案

核心报错原因

你遇到的datatype mismatch错误大概率来自两类场景:

  1. 表结构改完后,Kotlin侧调用插入方法时仍然传入Int类型的id值,和字段要求的TEXT(String)类型不匹配
  2. 仅修改了.sq文件中的表定义语句,没有配置对应的数据库迁移脚本,用户设备上留存的旧版本表结构id字段仍为Int类型

排查&解决步骤

  • 第一步:核对SQLDelight生成的插入方法参数
    改完.sq文件的表结构后,先执行项目的generateSqlDelightInterface Gradle任务,重新生成数据库操作接口,确认生成的insertSidework方法第一个id参数类型为String,如果仍然是Int需要同步清理构建缓存后重新生成。
  • 第二步:补全数据库迁移脚本
    SQLite不支持直接修改已有字段的类型,需要按以下流程写版本迁移脚本(假设你之前的数据库版本号为1,升级后为2):
    1. 在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;
    
    1. 同步修改数据库初始化时的版本号为2,确保App启动时会执行迁移脚本。
  • 第三步:核对插入时的id赋值逻辑
    原来Int类型主键如果开启了自增特性,换成TEXT类型主键后SQLite不会自动生成id,需要手动传入全局唯一的字符串(比如UUID生成的字符串),不要继续传入Int类型的数值或者空值。

小概率问题排查

如果以上操作都做了还是报错,检查数据库初始化时的字段Adapter配置,确认有没有给id字段错误配置了Int类型的适配器,导致String类型的id被转成Int存入数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:06:09