Android Room 是否提供 SqliteOpenHelper onCreate() 和 onUpdate() 替代方案?

Does Android Room offer SqliteOpenHelper onCreate() & onUpdate() alternative?

使用SqliteOpenHelper,如果是第一次创建数据库,我可以依赖onCreate()方法初始化一些数据库工作。

另外,使用 onUpdate() 方法,我可以很容易地检测到用户是否有旧版本的数据库,我可以很容易地更新它。

Room 是否支持其他使用方法?

下面是一个示例,说明如何在 Room 中执行模式迁移,这类似于在 SqliteOpenHelper 中使用 onUpdate() 方法:

Room.databaseBuilder(context, RepoDatabase.class, DB_NAME)
.addMigrations(FROM_1_TO_2)
.build();

static final Migration FROM_1_TO_2 = new Migration(1, 2) {
    @Override
    public void migrate(final SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE Repo 
                         ADD COLUMN createdAt TEXT");
        }
    };

更多信息Here

1。 SQLiteOpenHelper.onCreate

是的,有回调 class。 您可以像这样

添加回调到 RoomDatabase.Builder
Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
    .addCallback(new Callback() {
        @Override
        public void onCreate(@NonNull SupportSQLiteDatabase db) {
            super.onCreate(db);
            //do something
        }

        @Override
        public void onOpen(@NonNull SupportSQLiteDatabase db) {
            super.onOpen(db);
            //do something
        }
    })
    .build();

2。 SQLiteOpenHelper.onUpdate

是的,有迁移 class。 您可以像这样 RoomDatabase.Builder 添加迁移

Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
    .addMigrations(MIGRATION_1_2, MIGRATION_2_3).build();

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, "
                + "`name` TEXT, PRIMARY KEY(`id`))");
    }
};

static final Migration MIGRATION_2_3 = new Migration(2, 3) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE Book "
                + " ADD COLUMN pub_year INTEGER");
    }
};

如果应用程序正在将数据库版本 1 升级到 4。

  1. 案例 A。如果您已经为版本 1 到版本 4 定义了迁移。
    • 繁荣。 room 只会触发一个迁移代码。版本 1 到 4。
  2. 情况 B。如果您已经为版本 1 到 2、版本 2 到 3、版本 3 到 4 定义了迁移。
    • room会依次触发所有迁移

你应该检查这个文档 Migrating Room databases

和这篇文章 Understanding migrations with Room