美文网首页
Android room数据库迁移

Android room数据库迁移

作者: CrazySnow | 来源:发表于2023-11-19 18:09 被阅读0次

    在 Room 中使用 Migration 迁移工具 升级数据库步骤 :

    如果不想提供迁移策略,直接进行破坏性升级(不保留之前的数据),可以直接使用 fallbackToDestructiveMigration()

    • 更新数据模型 :
      如果要 更改数据库的结构 , 更新 Entity 实体类 , 修改实体类就是修改数据库表结构 ; 修改 Dao 数据库访问接口对象 , 包括添加 / 删除 / 修改 表 / 列 / 索引 ;
    • 创建迁移类 :
      创建一个用于执行数据库迁移的 迁移类 Migration , Migration 迁移类应 实现 Room 的 Migration 接口 , 并 定义数据库从旧版本迁移到新版本的操作 ;
    • 指定迁移规则 :
      在 Room 数据库的构建器中 , 使用 addMigrations 方法指定迁移规则 , 该方法接受一组 Migration 迁移对象 , 每个 Migration 迁移对象 代表一个数据库版本之间的迁移操作 ;
    • 执行迁移 :
      当应用程序启动并访问数据库时,Room 将自动检测数据库版本并执行适当的迁移操作 , 应用程序可以无缝地将旧版本的数据库迁移到新版本,而不会丢失现有的数据。
    自动升级

    exportSchema必须设置为true(默认为true),否则会出现如下报错
    Cannot create auto migrations when export schema is OFF.
    首先需要在@Database注解中增加autoMigrations

    @Database(entities = {User.class, Book.class}, version = 3,exportSchema = true,autoMigrations = @AutoMigration(from = 2,to = 3,spec = UserRoomDatabase.TestAutoMigration.class))
    

    如果 Room 发现迁移过程中有歧义,并且在未提供更多信息的时候无法制定确切的自迁移方案,在编译期间就会发生错误,这时开发者需要提供一个 AutoMigrationSpec 的实现。多数情况下,自迁移发生错误都是由下列的原因造成的。

    • 删除或者重命名数据表名
    • 删除或者重命名数据表的列名
        @RenameColumn(tableName = "user_table", fromColumnName = "job", toColumnName = "user_job")
        static class TestAutoMigration implements AutoMigrationSpec { }
    

    AutoMigrationSpec 实现类的注解

    手动升级

    //修改version = 2
    @Database(entities = {User.class, Book.class}, version = 2,exportSchema = true)
    创建具体的版本迁移策略

        //添加字段 具体的版本迁移策略
        public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
            @Override
            public void migrate(@NonNull SupportSQLiteDatabase database) {
                //添加字段
    //            database.execSQL("ALTER TABLE user_table ADD COLUMN job TEXT NOT NULL DEFAULT '民工'");
                database.execSQL("ALTER TABLE user_table ADD COLUMN job TEXT");
    //            database.execSQL("ALTER TABLE user_table RENAME COLUMN job TO user_job");
            }
        };
    
    
    
        //单例创建database
        static UserRoomDatabase getDatabase(final Context context) {
            if (INSTANCE == null) {
                synchronized (UserRoomDatabase.class) {
                    if (INSTANCE == null) {
                        INSTANCE = Room.databaseBuilder(
                                context.getApplicationContext(),
                                UserRoomDatabase.class, DATABASE_NAME)
                                .addMigrations(MIGRATION_1_2)////添加完了migration后,根据Room.builder把我们版本更新的信息add进去
                                .build();
                    }
                }
            }
            return INSTANCE;
        }
    

    补充

    exportSchema设置为 true后,会在指定路径(app的build.gradle里设置的)下生成一个json文件,里面有不同版本的表的信息。 AutoMigrationSpec 实现类的注解

    json文件所在位置.jpg

    相关文章

      网友评论

          本文标题:Android room数据库迁移

          本文链接:https://www.haomeiwen.com/subject/limewdtx.html