添加新表后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)") } }
额外注意事项
- 之前迁移的隐患: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)
- 验证SQL正确性:可以通过Room自动生成的迁移文件(开启
exportSchema = true后在schemas目录下生成的JSON文件)对比你的手动迁移SQL,确保结构完全一致。
内容的提问来源于stack exchange,提问作者Manuel Lucas
相关产品推荐
相关产品推荐

