# Android — Room 数据库跳跃式升级(Migration) 站点:答源(https://www.dandroid.cn/) 原文:https://www.dandroid.cn/archives/21335 Canonical:https://www.dandroid.cn/archives/21335 作者:admin 发布日期:2023-09-26 最后更新:2023-09-26 15:58 分类:简书 内容类型:post 说明:本页是原文的纯文本镜像,供大模型与检索器完整读取;不含导航、广告、付费框。引用请以上方「原文」链接为准。 ## 正文   前言 在平时的开发时,数据库的升级并不总是按部就班的从 version: 1->2,2->3,3->4。总是会出现 version:1->3,或 2->4 的情况。这时候我们又该怎么办呢? 方法很简单。当用户升级 APP 时,我们替用户升级数据库版本。 具体做法: version:1->2 static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { //do something } }; version:2->3 static final Migration MIGRATION_2_3 = new Migration(2, 3) { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE student " + " ADD COLUMN phone_num TEXT"); } }; 把migration 添加到 Room database builder: database = Room.databaseBuilder(context.getApplicationContext(), StudentDatabase.class, "Demo.db") .addMigrations(MIGRATION_1_2, MIGRATION_2_3) .build(); 复杂表操作: 字段类型修改 version:3->4 static final Migration MIGRATION_3_4 = new Migration(3, 4) { @Override public void migrate(SupportSQLiteDatabase database) { //创建表 database.execSQL( "CREATE TABLE student_new (student_id TEXT, student_name TEXT, phone_num INTEGER, PRIMARY KEY(student_id))"); //复制表 database.execSQL( "INSERT INTO student_new (student_id, student_name, phone_num) SELECT student_id, student_name, phone_num FROM student"); //删除表 database.execSQL("DROP TABLE student"); //修改表名称 database.execSQL("ALTER TABLE student_new RENAME TO students"); } }; 多版本迁移 要是用户刚下载的 APP,想升级到版本最新版本呢?目前我们定义了migrations:version 1 到 2, version 2 到 3, version 3 到 4, 所以 Room 会一个接一个的触发所有 migration。 其实 Room 可以处理大于 1 的版本增量:我们可以一次性定义一个从1 到4 的 migration,提升迁移的速度。 static final Migration MIGRATION_1_4 = new Migration(1, 4) { @Override public void migrate(SupportSQLiteDatabase database) { //创建表 database.execSQL( "CREATE TABLE student_new (student_id TEXT, student_name TEXT, phone_num INTEGER, PRIMARY KEY(student_id))"); //复制表 database.execSQL( "INSERT INTO student_new (student_id, student_name, phone_num) SELECT student_id, student_name, phone_num FROM student"); //删除表 database.execSQL("DROP TABLE student"); //修改表名称 database.execSQL("ALTER TABLE student_new RENAME TO students"); } }; 接着,我们只需把它添加到 migration 列表中: database = Room.databaseBuilder(context.getApplicationContext(), StudentDatabase.class, "Demo.db") .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_1_4) .build(); --- 由 答源 DAN 底座 1.4.1 生成 · 2026-11-14T05:13:58+00:00