Room数据库列重命名迁移失败,SQLite语法错误排查
SQLite版本限制导致Room迁移重命名列失败的解决方案
兄弟,你碰到的这个问题根源是SQLite版本兼容性:SQLite直到3.25.0版本(2018年发布)才支持ALTER TABLE ... RENAME COLUMN语法,但很多Android设备搭载的SQLite版本都低于这个门槛,所以直接用这条SQL会触发语法错误。
要兼容低版本设备,得用SQLite传统的列重命名方案——通过「创建新表→迁移数据→替换旧表」的流程实现,修改后的Migration代码如下:
public static final Migration MIGRATION_11_12 = new Migration(11, 12) { @Override public void migrate(SupportSQLiteDatabase database) { // 1. 创建和原表结构一致的临时表,替换目标列名 database.execSQL("CREATE TABLE content_new (" + "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + "dismissCount INTEGER NOT NULL," + // 原列名archiveCount替换为dismissCount "title TEXT NOT NULL," + // 原表其他列完整保留,要和原结构完全一致 "content TEXT," + "createTime INTEGER NOT NULL)"); // 2. 把旧表数据迁移到新表,映射新旧列名 database.execSQL("INSERT INTO content_new (id, dismissCount, title, content, createTime) " + "SELECT id, archiveCount, title, content, createTime FROM content"); // 3. 删除旧表 database.execSQL("DROP TABLE content"); // 4. 将临时表重命名为原表名 database.execSQL("ALTER TABLE content_new RENAME TO content"); // 如果原表有索引,记得在这里重新创建,比如: // database.execSQL("CREATE INDEX index_content_title ON content(title)"); } };
注意事项:
- 临时表的结构必须和原表完全一致,包括主键、非空约束、列顺序等,否则会导致数据丢失或迁移失败
- 如果原表有索引、外键关联,迁移完成后需要重新创建对应的索引和外键
- 测试时尽量覆盖低Android版本的设备,确保迁移逻辑在旧SQLite环境下正常运行
内容的提问来源于stack exchange,提问作者mW3
相关产品推荐
相关产品推荐

