在房间迁移之间访问DAO

时间:2019-08-13 10:07:17

标签: java android sqlite android-room

继续该主题始于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类。

0 个答案:

没有答案