【问题标题】:Room Database migration房间数据库迁移
【发布时间】:2019-02-13 14:25:36
【问题描述】:

如果我有 db 版本 10,我必须为 Room 迁移使用多少种方法?

我查看了以下示例 Google Persistence Migration Sample

我发现 Migration 可变参数基于数据库版本 4 的可能场景。

public static UsersDatabase getInstance(Context context) {
    synchronized (sLock) {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                    UsersDatabase.class, "Sample.db") 
                    .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_1_4)
                    .build(); 
        } 
        return INSTANCE;
    } 
} 

我的问题是,假设我正在使用 db v1 中的 Room,当我的应用程序到达 db v10 时,我需要编写多少种迁移方法?

在 sqlite 中,我们在 onUpgrade 中获取已安装应用程序的当前 db 版本,我们只是通过 switch case 而不使用 break 语句,以满足所有 db 升级。

但是,我不确定,但是 afaik,我们无法在房间中获取已安装应用程序的当前 db 版本,我们编写了所有可能的迁移方法。

但是如果我有db v10,写总共45个方法感觉很不方便,不合适!

有没有更好的解决方案?

【问题讨论】:

    标签: android database sqlite android-room


    【解决方案1】:

    假设我正在使用 db v1 中的 Room,当我的应用程序到达 db v10 时,我需要编写多少种迁移方法?

    9.

    一种方法是:1->2、2->3、3->4、4->5、5->6、6->7、7->8、8->9 和 9- >10.

    另一种方法是:1->10、2->10、3->10、...、9->10。

    我的猜测是第一种方法更受欢迎,因为它更容易开发。对于每个新的数据库版本,您只需创建一个额外的对象。

    在 sqlite 中,我们在 onUpgrade 中获取已安装应用程序的当前 db 版本,我们只是通过 switch case 而不使用 break 语句,以便满足所有 db 升级。

    这将与您在 Room 中执行的代码行数大致相同。你的每一个case 语句都会变成一个Migration 对象,处理增量升级(例如,3->4)。

    但是如果我有db v10,写总共45个方法感觉很不方便,不合适!

    Room 知道如何根据需要“拼接”各个迁移以达到目标版本。所以,在我概述的第一种方法中,如果一个应用程序需要从 3 迁移到 10,Room 可以使用 3->4, 4->5, 5->6, ..., 9->10 来获得在那里。

    【讨论】:

    • 感谢您的精彩解释。但是,如果我想回到以前的版本怎么办?例如,假设我有带有 db_v1 的 APK 1 和带有 db_v2 的 APK 2。所以,我的客户正在使用 APK 2,但由于某种原因他们需要回到 APK 1。如何处理这种情况?谢谢。
    • @JuniaMontana:“如何处理这种情况?” ——我从来没有调查过。对不起!
    • @juniaMontana:我们目前面临同样的问题。我们的计划是为每个 apk 创建一个 1->2 和 2->1 脚本,并将它们累积存储到平板电脑文件系统中(我们是根应用程序)。如果您曾经安装过 APK 2,然后恢复到 APK 1,那么 2->1 脚本将存在,并且旧代码可以恢复数据库,而无需了解有关此“未来”版本的任何信息。
    • @MarkBrown 您是否使用常规 sql 命令编写脚本?你介意分享这个想法吗?另外,你的计划是什么,你有 apk 5 并且数据库之间发生了变化,所以你必须相应地增加版本,你是如何处理从 apk 5 降级到 1 的?谢谢。
    • @JuniaMontana:目前,“这是计划”,因为我们还没有编写任何代码。脚本可以只包含 SQL 命令,也可以包含我们想要执行的任意数量的操作。这个想法是迁移步骤将加载和解析文件,然后执行我们想要执行的任何操作,这可能是 sql 语句。我们计划为每个增量创建一个脚本,因此我们将有 1->2、2->3、3->4、4->5 以及 5->4、4->3 等等,所以房间迁移应该一次处理一个。我们将根据需要为每个步骤动态添加尽可能多的迁移对象。
    【解决方案2】:

    将版本 1 到 9 的迁移写入 v10。

    public static UsersDatabase getInstance(Context context) {
    synchronized (sLock) {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                    UsersDatabase.class, "Sample.db") 
                    .addMigrations(MIGRATION_1_10, MIGRATION_2_10, MIGRATION_3_10, MIGRATION_4_10, .......)
                    .build(); 
        } 
        return INSTANCE;
    } 
    } 
    

    一旦您知道您的数据库架构,您就可以直接从 v1 迁移到 v10,从 v2 迁移到 v10 等等。

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 2021-09-02
      • 1970-01-01
      • 2021-11-18
      • 2018-11-11
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      相关资源
      最近更新 更多