房间数据库迁移

7

如果我有数据库版本10,那么我需要为Room迁移制作多少个方法?

我研究了以下示例Google Persistence Migration Sample

我发现基于数据库版本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版本,然后我们只需通过没有break语句的switch case即可满足所有db升级。
但是,我不确定,但据我所知,在room中,我们无法获取已安装应用程序的当前db版本,因此我们编写了所有可能的迁移方法。
但如果我有db v10,写45个方法感觉非常不方便、不合适!
有更好的解决方案吗?
2个回答

12
假设我使用的是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中获得已安装应用程序的当前数据库版本,并且我们只需通过没有break语句的switch case来满足所有的数据库升级。
这将大致相同数量的代码行,或多或少,与您在Room中所做的相同。您的每个case语句都会转换为一个Migration对象,处理增量升级(例如3->4)。
但如果我的db是v10,写45个方法总感觉很不方便、不合适!
Room知道如何“拼接”单个迁移以达到目标版本。因此,在我概述的第一种方法中,如果应用程序需要从3迁移到10,Room可以使用3->4、4->5、5->6、...、9->10来实现。

1
谢谢您的详细解释。但是,如果我想回到以前的版本怎么办?例如,假设我有带有db_v1的APK 1和带有db_v2的APK 2。因此,我的客户正在使用APK 2,但由于某种原因,他们需要返回到APK 1。如何处理这种情况?谢谢。 - Junia Montana
@MarkBrown 你是用普通的 SQL 命令来编写脚本的吗? 不介意分享一下您的想法吗? 此外,如果您有 APK 5,并且在其中进行了数据库更改,因此必须相应地增加版本,则您的计划是什么? 您如何处理从 APK 5 降级到 1? 谢谢。 - Junia Montana
2
@JuniaMontana:目前,“这是计划”,因为我们还没有编写任何代码。脚本可以仅包含SQL命令,也可以包含我们想要执行的任意数量的操作。想法是迁移步骤将加载和解析文件,然后执行我们想要执行的任何操作,通常是SQL语句。我们计划为每个增量创建一个脚本,因此我们将有1->2、2->3、3->4、4->5以及5->4、4->3等,因此Room Migrations应该一次处理一个。我们将根据需要动态添加尽可能多的迁移对象。 - Mark Brown
1
@MarkBrown 看起来这是目前唯一的选择。我也是用同样的方法解决了这个问题。感谢分享。 - Junia Montana
1
回到正题,我们已经按照上述描述实施了“计划”,一切都运作良好。希望这能帮助其他人。 - Mark Brown
显示剩余2条评论

1
编写迁移脚本,将版本1至9升级到版本10。保留HTML格式不做解释。
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等。

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