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

Android Room是否提供SqliteOpenHelper onCreate()和onUpdate()替代方案?,android,android-sqlite,android-room,android-database,Android,Android Sqlite,Android Room,Android Database,使用SqliteOpenHelper,如果数据库是第一次创建的,我可以依靠onCreate方法初始化一些数据库工作 另外,使用onUpdate方法,我可以很容易地检测到用户是否有旧版本的DB,并且我可以很容易地更新它 Room是否支持使用其他方法?下面是一个如何在Room中进行架构迁移的示例,类似于在SqliteOpenHelper中使用onUpdate方法: Room.databaseBuilder(context, RepoDatabase.class, DB_NAME) .addMigra

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

另外,使用onUpdate方法,我可以很容易地检测到用户是否有旧版本的DB,并且我可以很容易地更新它


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");
        }
    };
更多信息

1。SQLiteOpenHelper.onCreate 是的,有回调类。 您可以像这样向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();
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");
    }
};
2.SQLiteOpenHelper.onUpdate 是的,有迁移类。 您可以像这样向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();
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

案例A.如果您已定义版本1到版本4的迁移。 繁荣room将只触发一个迁移代码。版本1至4。 案例B.如果您已经定义了版本1到2、版本2到3、版本3到4的迁移。 房间将一个接一个地触发所有迁移。 您应该检查此文档

这篇文章呢