当数据库使用房间持久库时,如何升级数据库时如何获得回调?我提供了迁移类,以在升级数据库时将一些列添加到表中。
// customize SupportSQLiteOpenHelper.Factory
public class DecoratedOpenHelperFactory implements SupportSQLiteOpenHelper.Factory {
@NonNull
private final SupportSQLiteOpenHelper.Factory delegate;
@Nullable
private final SupportSQLiteOpenHelper.Callback customListener;
public DecoratedOpenHelperFactory(@NonNull SupportSQLiteOpenHelper.Factory factory, @Nullable SupportSQLiteOpenHelper.Callback customListener) {
this.delegate = factory;
this.customListener = customListener;
}
@Override
public SupportSQLiteOpenHelper create(@NonNull SupportSQLiteOpenHelper.Configuration configuration) {
final SupportSQLiteOpenHelper.Configuration sqliteConfig = SupportSQLiteOpenHelper.Configuration.builder(configuration.context)
.name(configuration.name)
.callback(new DecoratedCallback(configuration.callback, customListener))
.build();
return delegate.create(sqliteConfig);
}
}
// customize SupportSQLiteOpenHelper.Callback
public class DecoratedCallback extends SupportSQLiteOpenHelper.Callback {
@NonNull
private final SupportSQLiteOpenHelper.Callback delegate;
@Nullable
private final SupportSQLiteOpenHelper.Callback customListener;
public DecoratedCallback(@NonNull SupportSQLiteOpenHelper.Callback supportSqLiteOpenHelperCallback, @Nullable SupportSQLiteOpenHelper.Callback customListener) {
super(supportSqLiteOpenHelperCallback.version);
this.delegate = supportSqLiteOpenHelperCallback;
this.customListener = customListener;
}
@Override
public void onCreate(@Nullable SupportSQLiteDatabase db) {
delegate.onCreate(db);
Optional.ofNullable(customListener).ifPresent(customListener -> customListener.onCreate(db));
}
@Override
public void onUpgrade(SupportSQLiteDatabase db, int oldVersion, int newVersion) {
delegate.onUpgrade(db, oldVersion, newVersion);
Optional.ofNullable(customListener).ifPresent(customListener -> customListener.onUpgrade(db, oldVersion, newVersion));
}
@Override
public void onDowngrade(SupportSQLiteDatabase db, int oldVersion, int newVersion) {
delegate.onDowngrade(db, oldVersion, newVersion);
Optional.ofNullable(customListener).ifPresent(customListener -> customListener.onDowngrade(db, oldVersion, newVersion));
}
@Override
public void onOpen(SupportSQLiteDatabase db) {
delegate.onOpen(db);
Optional.ofNullable(customListener).ifPresent(customListener -> customListener.onOpen(db));
}
@Override
public void onCorruption(SupportSQLiteDatabase db) {
Optional.ofNullable(customListener).ifPresent(customListener -> customListener.onCorruption(db));
}
}
最后,您可以使用这样的房间:
Room.databaseBuilder(context, databaseName)
.openHelperFactory(new DecoratedOpenHelperFactory(
new FrameworkSQLiteOpenHelperFactory(), new SupportSQLiteOpenHelper.Callback() {
@Override
public void onCreate(SupportSQLiteDatabase db) {
}
@Override
public void onUpgrade(SupportSQLiteDatabase db, int oldVersion, int newVersion) {
}
// etc
}))
.build();
您需要提供房间数据库回调,如下所述。
return Room.databaseBuilder(application, WalletDatabase.class, "wallet.db")
.addMigrations(MIGRATION_1_3)
.addMigrations(MIGRATION_2_3)
.addCallback(callback)
.build();
声明回调如下所述。
public static RoomDatabase.Callback callback = new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
//DO AS NEEDED
}
@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
//DO AS NEEDED
}
};