【问题标题】:Room database schema update房间数据库架构更新
【发布时间】:2019-11-01 18:02:39
【问题描述】:

我的应用程序处于发布模式,我正在使用房间数据库,而我之前的数据库版本是 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 中我想保留用户数据并删除回退破坏。

我怎样才能做到这一点?

【问题讨论】:

    标签: java android android-room


    【解决方案1】:

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

    也就是说,如果提供了 Migration,则使用它并绕过回退/销毁。

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

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

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

    【讨论】:

    • 非常感谢您提供清晰、简洁和详细的回答。一定要实现这个
    猜你喜欢
    • 2022-01-23
    • 2019-10-22
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    相关资源
    最近更新 更多