Android Room是否提供SqliteOpenHelper onCreate()和onUpdate()替代方案?
使用SqliteOpenHelper,如果数据库是第一次创建的,我可以依靠onCreate方法初始化一些数据库工作 另外,使用onUpdate方法,我可以很容易地检测到用户是否有旧版本的DB,并且我可以很容易地更新它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
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的迁移。
房间将一个接一个地触发所有迁移。
您应该检查此文档
这篇文章呢