android - 无数据丢失的房间数据库架构更新

标签 android sqlite kotlin android-sqlite android-room

我使用 Kotlin 在 Android 中开发了一个应用程序,它可以在 Playstore 上找到。我使用 Room 数据库来存储值。我有以下疑问:

  1. 现在数据库架构发生了变化,我需要如何处理它。我引用了下面的教程,但仍然不清楚如何处理迁移中的架构更改。 访问https://developer.android.com/training/data-storage/room/migrating-db-versions.html

  2. 如何使用 Playstore 版本测试我当前的应用程序?

提前感谢您的帮助。

最佳答案

这是一个相当复杂的问题,但基本上你有 2 个策略:

  • fallbackToDestructiveMigration -> 易于实现,但应用更新后您的用户将丢失数据
  • 提供迁移策略(最好)

案例 1 - fallbackToDestructiveMigration

在您的数据库初始化中,只需在您的数据库构建器上调用fallbackToDestructiveMigration:

database = Room.databaseBuilder(context.getApplicationContext(),
                        UsersDatabase.class, "Sample.db")
                .fallbackToDestructiveMigration()
                .build();

在这种情况下,由于您已经更新了数据库版本(假设从版本 1 到版本 2),Room 找不到任何迁移策略,因此它将回退到破坏性迁移,表被删除 .

案例二——智能迁移

假设您有一个名为“Users”的表,并且假设您在数据库版本 2 中向该表添加了一列。我们将此列称为“user_score” 您应该实现 Migration 类的 migrate 接口(interface),以便将“用户版本 1”模式更新为“用户版本 2”模式。为此,您需要一个alter table,您可以将其直接写在migrate 方法中:

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            // Your migration strategy here
            database.execSQL("ALTER TABLE Users ADD COLUMN user_score INTEGER")
        }
    };
database =  Room.databaseBuilder(context.getApplicationContext(),
        UsersDatabase.class, "Sample.db")
        .addMigrations(MIGRATION_1_2)
        .build();

更多引用:

关于android - 无数据丢失的房间数据库架构更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56478785/

相关文章:

android - 列表内的 HashMap Kotlin (Android)

android - 如何让我的应用程序始终保持领先,优先于其他应用程序?

android - 在 TextView 上绘制背景(不是全宽)

android - 为什么我的 android 微调器看起来很糟糕?

sqlite - 当值来自多个表时,如何在SQLite中使用WHERE BETWEEN子句?

java - SQLite 'Database Locked' 特定查询的奇怪错误

java - 在Android Kotlin上使用 Canvas mask 输入的文本

Kotlin 声明冲突

android - 在 intent.ACTION_VIEW 中为视频设置标题

java - 如何从PreparedStatement 中获取错误或警告?