会议室数据库架构更新而不会丢失数据

时间:2019-06-06 13:35:43

标签: 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版本测试当前的应用程序?

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

这是一个非常复杂的问题,但是基本上您有两种策略:

  • fallbackToDestructiveMigration->易于实施,但一旦应用程序更新,您的用户将丢失其数据
  • 提供Migration策略(最好)

案例1-fallbackToDestructiveMigration

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

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

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

案例2-智能迁移

假设您有一个名为“ Users”的表,并假定在数据库的版本2中向该表添加了一个列。我们将此列称为“ user_score”。您应该实现migrate类的Migration接口,以便将“用户版本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();

更多参考资料:

答案 1 :(得分:1)

对于问题2,您可以执行以下操作:

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

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

  3. 通过执行以下adb命令

    在设备中安装已签名的apk文件

    adb install -r "apk_file_path"

希望这会起作用。

答案 2 :(得分:0)

您应该使用VCS(例如git)。对于您的每个版本的应用,您都应该创建一个标签,以便您可以轻松地在发布的版本之间切换以测试兼容性。

可以通过在迁移过程中在会议室数据库上调用原始查询来完成迁移本身。如果您不知道如何编写这些内容,则应首先阅读一些有关SQL的教程。