会议室数据库架构更新

时间:2019-11-01 18:02:39

标签: java android android-room

我的应用程序处于发布模式,并且我正在使用会议室数据库,而我以前的数据库版本是2,并且已启用回退到破坏性迁移的功能。

@Database(entities = {
        User.class,ApplicationSetting.class},
        version = 2,
        exportSchema = false)
abstract public class DatabaseContext extends RoomDatabase {

    private static final Object sLock = new Object();
    private static DatabaseContext INSTANCE;
    public static String DATABASE_NAME = AppConstants.DATABASE_NAME;

    public static DatabaseContext getInstance(Context context) {
        synchronized (sLock) {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                        DatabaseContext.class, DATABASE_NAME)
                        .fallbackToDestructiveMigration()
                        .build();
            }
            return INSTANCE;
        }
    }

我在表中添加了新列,并将版本更改为3。现在,我想提供从版本2到版本3的迁移,以免数据丢失。但是我很困惑,因为在版本2中启用了回退破坏性迁移,现在在版本3中我想保留用户数据并删除回退破坏。

我该如何实现?

1 个答案:

答案 0 :(得分:2)

使用 fallbackToDestructiveMigration 时,如果没有为迁移定义的迁移,它只会销毁(删除表并重新创建它们),因此您可以添加2到3个迁移。 / p>

也就是说,如果提供了迁移,则会使用它并绕过回退/破坏。

推荐的一种替代方法是使用 fallbacktodestructivemigrationfrom ,它可以用于定义要应用回退的特定缺失迁移。

例如您可以使用.fallbackToDestructiveMigrationFrom(1,7)

  • 1允许从1破坏到2
  • 7允许从7破坏到8 (添加只是为了表明可以提供多个起始版本)
  • 其他人的2到3、3到4等需要迁移。
  • 请注意,这是更具体的内容,因此,如果提供从1到2或从7到8的迁移,则会导致异常。