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。
- 案例 A。如果您已经为版本 1 到版本 4 定义了迁移。
- 繁荣。 room 只会触发一个迁移代码。版本 1 到 4。
- 情况 B。如果您已经为版本 1 到 2、版本 2 到 3、版本 3 到 4 定义了迁移。
- room会依次触发所有迁移
你应该检查这个文档
Migrating Room databases
使用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.BuilderRoom.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。
- 案例 A。如果您已经为版本 1 到版本 4 定义了迁移。
- 繁荣。 room 只会触发一个迁移代码。版本 1 到 4。
- 情况 B。如果您已经为版本 1 到 2、版本 2 到 3、版本 3 到 4 定义了迁移。
- room会依次触发所有迁移
你应该检查这个文档 Migrating Room databases