SQLite 手动升级 → Room Migration

SQLite 手动升级 → Room Migration

老写法(Java + SQLiteOpenHelper)

java 复制代码
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
        db.execSQL("ALTER TABLE item ADD COLUMN description TEXT");
        db.execSQL("ALTER TABLE item ADD COLUMN category TEXT DEFAULT '其他'");
    }
    if (oldVersion < 3) {
        db.execSQL("ALTER TABLE item ADD COLUMN create_time INTEGER DEFAULT 0");
        // 迁移旧数据
        db.execSQL("UPDATE item SET create_time = ? WHERE create_time = 0",
                new Object[]{System.currentTimeMillis()});
    }
}

问题在哪里

版本号和 SQL 全靠自己维护,多版本连续升级逻辑如果写错了顺序会丢数据。升级前无法做校验,升级后无法做验证,也没有编译期安全。最容易线上灾难的代码之一------ALTER TABLE 在 Android 上对 SQLite 的兼容性差异很大。

新写法(Room Migration)

kotlin 复制代码
val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(db: SupportSQLiteDatabase) {
        db.execSQL("ALTER TABLE item ADD COLUMN description TEXT")
        db.execSQL("ALTER TABLE item ADD COLUMN category TEXT NOT NULL DEFAULT '其他'")
    }
}

val MIGRATION_2_3 = object : Migration(2, 3) {
    override fun migrate(db: SupportSQLiteDatabase) {
        db.execSQL("ALTER TABLE item ADD COLUMN create_time INTEGER NOT NULL DEFAULT 0")
        db.execSQL("UPDATE item SET create_time = ? WHERE create_time = 0",
                arrayOf(System.currentTimeMillis()))
    }
}

// 构建
val db = Room.databaseBuilder(context, AppDatabase::class.java, "app.db")
        .addMigrations(MIGRATION_1_2, MIGRATION_2_3)
        .build()

未匹配的版本跳转用 fallbackToDestructiveMigration()

kotlin 复制代码
Room.databaseBuilder(context, AppDatabase::class.java, "app.db")
        .fallbackToDestructiveMigration()
        .build()

一句话注意

Migration(startVersion, endVersion) 的版本号必须严格连续 ,不能跳号。Room 会按顺序应用所有匹配的 Migration。比如数据库当前版本是 1,目标版本是 3,Room 会自动依次执行 MIGRATION_1_2MIGRATION_2_3

fallbackToDestructiveMigration() 会删库重建------升级后旧数据全部丢失。只有开发阶段可以用,线上千万不能配。如果线上有用户跳版本更新(比如 1 直接升到 4),确保 1→2、2→3、3→4 的 Migration 全部写好了,Room 会自动串联。


Java Android 老项目迁移系列,持续更新中。

相关推荐
·薯条大王7 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
YB13759 小时前
jetpack compose 副作用 SideEffect
android·kotlin
ZJH__GO10 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆10 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光10 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林10 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
CHB11 小时前
uni-app x 蒸汽模式 性能测试基准报告 Benchmark【Android版】
android·ios·uni-app
marvelyu11 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
带娃的IT创业者12 小时前
拆掉那堵墙:LibrePods 如何让 AirPods 在 Android 上重获新生
android·开源项目·airpods·librepods·生态解锁
AI人工智能+电脑小能手12 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦