如果我的数据库版本为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种方法!
有更好的解决方案吗?
答案 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,依此类推。