在安卓开发中,数据库版本管理用于处理数据库结构变更(如新增表、修改字段类型),主要通过 Room
持久化库实现,支持结构化迁移(Migration)和破坏性重建两种方式。
通过 @Database
注解的 version
属性指定当前数据库版本:
@Database(entities = {User.class}, version = 3) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
当版本升级时,需提供 Migration
对象描述变更逻辑:
// 从版本1升级到版本2 Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase db) { db.execSQL("ALTER TABLE user ADD COLUMN age INTEGER"); // 添加新字段 } };
在 Room.databaseBuilder
中注册所有迁移:
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app-db") .addMigrations(MIGRATION_1_2) // 注册迁移 .build();
迁移类型 | 触发条件 | 实现方式 |
---|---|---|
新增表 | 版本升级时需要扩展数据结构 | CREATE TABLE 语句 |
修改字段类型 | 字段类型需要调整(如字符串→整数) | 新建临时表 → 数据转换 → 重命名 |
添加非空字段 | 需要强制填充默认值 | ALTER TABLE + DEFAULT 约束 |
当迁移成本过高时,可允许重建数据库(会丢失数据):
Room.databaseBuilder(context, AppDatabase.class, "app-db") .fallbackToDestructiveMigration() // 版本不匹配时自动重建 .build();
测试迁移逻辑:
Room.testing.MigrationTestHelper
模拟不同版本数据库。注意事项:
解答:
分阶段迁移,按以下步骤操作:
解答: