会议室数据库迁移

时间:2018-09-08 13:55:01

标签: android database sqlite android-room

如果我的数据库版本为10,我需要为Room迁移设置几种方法?

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

,我根据数据库版本4的可能场景找到了 Migration 变量。

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中获得了已安装应用程序的当前数据库版本,我们只是通过了switch情况而没有break语句,因此它可以满足所有数据库升级的要求。

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

但是感觉很不方便,如果我有db v10,则不宜编写总共45种方法!

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:5)

  

假设我正在使用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语句的切换情况,从而满足了所有数据库升级。

给出或接受的代码行数与您在Room中执行的代码行数相同。您的每个case语句都变成了一个Migration对象,用于处理增量升级(例如3-> 4)。

  

但是感觉很不方便,如果我有db v10,则不宜编写总共45种方法!

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

答案 1 :(得分:0)

写入从版本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,依此类推。