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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:16:50