为了账号安全,请及时绑定邮箱和手机立即绑定

房间数据库架构更新

房间数据库架构更新

烙印99 2024-01-28 16:10:37
我的应用程序处于发布模式,我正在使用房间数据库,我以前的数据库版本是 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 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

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

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

推荐的另一种选择是使用fallbacktopressivemigrationfrom,这可用于定义要应用回退的特定缺失迁移。

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

  • 1 允许破坏性从 1 到 2

  • 7 允许从 7 到 8 进行破坏性(添加只是为了表明可以提供多个启动版本)

  • 其他的 2 到 3、3 到 4 等将需要迁移。

  • 请注意,这是更具体的,因此如果提供 1 到 2 或 7 到 8 的迁移,将会导致异常。

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

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

推荐的另一种选择是使用fallbacktopressivemigrationfrom,这可用于定义要应用回退的特定缺失迁移。

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

  • 1 允许破坏性从 1 到 2

  • 7 允许从 7 到 8 进行破坏性(添加只是为了表明可以提供多个启动版本)

  • 其他的 2 到 3、3 到 4 等将需要迁移。

  • 请注意,这是更具体的,因此如果提供 1 到 2 或 7 到 8 的迁移,将会导致异常。


查看完整回答
反对 回复 2024-01-28
  • 1 回答
  • 0 关注
  • 74 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信