不会丢失数据的 Room 数据库模式更新

5
我使用Kotlin在Android上开发了一个应用程序,并将其放在了Play商店上。我使用了Room数据库来存储值。我有以下疑问:
  1. 现在数据库模式已更改,我需要如何处理它?我参考了下面的教程,但仍不清楚如何在迁移中处理模式更改。 访问https://developer.android.com/training/data-storage/room/migrating-db-versions.html

  2. 如何测试我的当前应用程序与Play商店版本?

感谢您提前的帮助。

1
如何处理数据库迁移将取决于您在模式中进行了哪些更改。例如,某些更改(添加)可能根本不需要任何操作。如果您发布您的先前和后来的模式,那将会很有帮助。 - mikejonesguy
1
如果您可以访问您在Play商店中构建和发布当前版本的代码,您可以构建一个调试APK,在测试设备上安装它,然后切换回当前代码并覆盖旧版本。这将为您提供可靠的用户升级场景模拟。 - mikejonesguy
我需要在表中添加几个新列,但不想丢失表中已存储的现有值。 - Rajiv Ranjan
我没有调试APK文件进行测试。我只有Playstore APK文件。 - Rajiv Ranjan
4个回答

8

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

  • fallbackToDestructiveMigration -> 实现简单,但应用程序更新后用户将失去他们的数据
  • 提供Migration策略(优选)

方案1 - fallbackToDestructiveMigration

在数据库初始化时,在数据库构建器上简单调用fallbackToDestructiveMigration

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

在这种情况下,由于您已更新数据库版本(假设从版本1升级到版本2),Room找不到任何迁移策略,因此它将回退到破坏性迁移,表将被删除。
第二种情况 - 智能迁移
假设您有一个名为“用户”的表,并且在数据库的第2个版本中添加了一个列。让我们称这个列为“user_score”。您应该实现Migration类的migrate接口,以便将您的“Users version 1”模式更新为“Users version 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();

更多参考资料在这里:


通过遵循这些方法,我成功解决了我的问题。感谢您的帮助和支持。 - Rajiv Ranjan
为测试该应用程序,我从Play商店下载了该应用程序,并通过以下方式安装了我的新签名应用程序:adb install -r <apk路径>,它会更新应用程序。 - Rajiv Ranjan
1
我遵循了“智能迁移-Case 2”来解决问题。谢谢。 - Rajiv Ranjan
那为什么它会删除方案未更改的表格呢?我已经向同一数据库中添加了新表并增加了版本,但它删除了旧的未更改的表格。 - user924
@NicolaGallazzi 你好,如何在不改变数据库结构的情况下更新现有数据库中的数据? - Nitin Karale
显示剩余2条评论

3
room version 2.4.0 开始,你可以使用自动迁移轻松更新。
数据库类。
@Database(
    version = 3,
    autoMigrations = [
        AutoMigration(from = 1, to = 2),
        AutoMigration(from = 2, to = 3)
    ],
    .....
)

数据类

@Entity(tableName = "user")
data class DataUser(
    ....
    // I added this column, like this
    @ColumnInfo(defaultValue = "")var test: String = ""  
)

请参见下面的参考资料

安卓开发者:Room 版本2.4.0

安卓开发者:AutoMigration


1

针对您的问题2,您可以采取以下措施:

  1. 从Play商店下载并在移动设备中安装apk文件。

  2. 构建您的apk文件(签名的apk)。在生成apk文件之前,请不要忘记增加版本代码。

  3. 按照以下adb命令在设备上安装已签名的apk文件:

    adb install -r "apk_file_path"

希望这能解决您的问题。


2
我尝试了相同的方法来测试应用程序,结果很好。谢谢。 - Rajiv Ranjan

-4

你应该使用版本控制系统(如git)。对于你的应用的每个版本,你应该创建一个标签,这样你就可以轻松地在发布的版本之间切换以测试兼容性。

迁移本身可以通过在你的迁移中对room数据库调用原始查询来完成。如果你不知道如何编写这些查询,你应该先阅读一些关于SQL的教程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接