继续该主题始于my previous question的注释。 在两阶段Room迁移中,实际上是否可以在两次迁移之间访问DAO?假设我要在第一个迁移v2-v3中创建一个表,并且需要执行复杂的查询才能将数据添加到该表中,然后才能执行下一个迁移v3-v4。
以前,我有两个单独的RoomDatabase类来表示两个迁移。该应用程序将首先实例化v2-v3迁移,并且数据库操作在其自己的存储库类中执行。该类具有访问在迁移2到3中创建的表的DAO的方法。此后,执行了第二个迁移。但是,这是一种不好的做法,因为尽管有一些解决方法,但我们仍试图从数据库中降级异常。
我知道在构建RoomDatabase时可以执行多次迁移,但是在第二次迁移中可以访问在先前的迁移中创建的表的DAO吗? 这是为了避免在3到4迁移类中编写数百行原始SQLite查询。 MyDatabase.java的实例化如下:
@Database(entities = {MealGroup.class, Meal.class, Nutrition.class}, version =4)
@TypeConverters({Converters.class})
public abstract class MyDatabase extends RoomDatabase {}
我已经尝试在myDatabase.java中实例化此类迁移3到4的类:
private static Migration MIGRATION_3_4 = new MigrationThreeToFour(3, 4,
new DayRepo(this, ShyeApplication.getDayInstance()));
这已经给我一个错误,因为无法访问“ this”,并且Migration实例必须是静态的。 DayRepo需要数据库实例来访问在MigrationTwoToThree类中创建的表的DAO。 在MigrationThreeToFour类中,使用DayRepo:
public MigrationThreeToFour(int startVersion, int endVersion, DayRepo repo) {
super(startVersion, endVersion);
this.dRepo = repo;
}
private void createDays(){
if(PurchaseUtils.isFullVersion(MyApplication.getAppContext()) || BuildConfig.APP_FLAVOR == AppFlavour.ndc){
dRepo.createAllDaysPremium(MDateUtils.currentTime());
}else {
dRepo.createAllDaysLite(MDateUtils.currentTime());
}
}
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.beginTransaction();
createDays();
...
这是数据库的实际构建:
public static ShyeDatabase buildDatabase(final Context appContext){
context = appContext;
try {
return Room.databaseBuilder(appContext, ShyeDatabase.class, DATABASE_NAME)
.addCallback(new Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
}
}).addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4).build();
} catch (Exception e){
e.printStackTrace();
}
return null;
}
还是我应该在migrate(@NonNull SupportSQLiteDatabase database)
方法内放弃并在原始SQLite中执行所需的数据库操作?显然这不是我想做的事情,因此为什么我首先要有两个单独的RoomDatabase类。