Android room数据库迁移

2023-11-19  本文已影响0人  CrazySnow

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

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

自动升级

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
上一篇下一篇

猜你喜欢

热点阅读