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

添加新表后Room数据库Migration(3,4)执行报错求助

问题排查与解决

核心错误原因

你遇到的near "'checkInDate'": syntax error是SQLite建表语法不符合规范导致的。在MIGRATION_3_4的SQL语句中,PRIMARY KEY约束的位置错误,干扰了后续列的定义解析。

具体修复方案

修改MIGRATION_3_4的建表语句,将PRIMARY KEY约束移到所有列定义之后:

val MIGRATION_3_4: Migration = object : Migration(3,4) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("CREATE TABLE IF NOT EXISTS `${DB_SHIFT_NAME}` (`id` INTEGER, `checkInDate` TEXT, PRIMARY KEY (`id`))")
    }
}

或者更简洁的写法,直接在列定义中声明主键:

val MIGRATION_3_4: Migration = object : Migration(3,4) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("CREATE TABLE IF NOT EXISTS `${DB_SHIFT_NAME}` (`id` INTEGER PRIMARY KEY, `checkInDate` TEXT)")
    }
}

额外注意事项

  1. 之前迁移的隐患:MIGRATION_1_2和MIGRATION_2_3的建表语句仅创建了空表,没有与实体类SellData、RegistrationData匹配的列结构。虽然暂时没报错,但后续操作这些表时会出现字段不存在的异常,建议补全对应表的列定义,比如:
// 示例:补全MIGRATION_1_2的SellData表结构
val MIGRATION_1_2: Migration = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("CREATE TABLE IF NOT EXISTS `${DB_SELLS_NAME}` (`time` TEXT PRIMARY KEY, `accepted` INTEGER, `name` TEXT, `quantity` TEXT, `unitPrice` TEXT, `totalPrice` TEXT, `type_sell` TEXT, `type_product` TEXT, `product_price` TEXT, `processorTextValue` TEXT)")
    }
}

(注:SQLite中布尔类型用INTEGER存储,0为false,1为true)

  1. 验证SQL正确性:可以通过Room自动生成的迁移文件(开启exportSchema = true后在schemas目录下生成的JSON文件)对比你的手动迁移SQL,确保结构完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:12:04