因此,我们有一个用户拥有应用版本1.0的场景。版本2.0出来了,但用户没有更新。当3.0版本出来时,用户决定更新。
由于用户尚未更新应用,因此领域文件也未更新,因此在从1.0版迁移到3.0版时,GCC C++ Compiler
version
参数的值将改为1 2.
当用户直接安装应用版本2.0然后迁移到3.0版时,也会出现问题。与前一种情况相同,Migration.execute
参数将是错误的。
有没有办法妥善处理这些案件?
答案 0 :(得分:4)
实际上,Realm的migration example显示了这种情况。
public class Migration implements RealmMigration {
@Override
public long execute(Realm realm, long version) {
// Step 0
if (version == 0) {
//Do the migration from 0 to 1
version++;
}
// Step 1
// Now the version is at least 1
if (version == 1) {
// Do the migration from 1 to 2
version++;
}
// Step 2
if (version == 2) {
// Do the migration from 2 to 3
version++;
}
// Now you get your final version 3
return version;
}
}
只需逐步编写迁移,逐个运行它们,直到获得最新的模式版本。对于您的情况,用户可能在此处具有Realm db版本0,并且将首先运行step0。然后版本在步骤0块中突然变为1,然后步骤1将运行。
------------直接更新用户安装版本3 ------------
创建领域实例时,代码如下:
RealmConfiguration config = new RealmConfiguration.Builder(this)
.migration(migration)
.schemaVersion(3)
.build();
Realm realm = Realm.getInstance(config);
请注意schemaVersion(3)
在这里。
只有在需要迁移时才会执行RealmMigration.execute()
。这意味着如果用户在没有安装任何先前版本的情况下直接安装版本3,则RealmMigration.execute()
将无法调用,并且在Realm文件初始化之后,架构版本将设置为3 强>
答案 1 :(得分:1)
我不是Realm
大师,我没有在实际项目中使用Realm
,但这种方法应该有效:
我们假设您使用this迁移示例:
您需要在项目中保存其他属性(例如SharedPreferences
) - latestMigrationVersion
。默认情况下,latestMigrationVersion = 0
,这意味着我们尚未运行迁移。
按以下方式修改Migration.java
课程:
@Override
public long execute(Realm realm, long version) {
// check if the previous migration took place
if (version > 0 && version - 1 > latestMigrationVersion) {
// user missed migration
// then we need to run previous missed migrations before
version = latestMigrationVersion;
}
// do migrations as described in the example.
...
// update latestMigrationVersion for future checks
latestMigrationVersion = version;
// save the property locally
}
现在,如果用户直接安装2.0版本,则在2.0 -> 3.0
迁移之前将执行所有先前的迁移。
Unit tests
应该可以帮助您检查所有可能的迁移:0.0 -> 3.0
,1.0 -> 2.0
,2.0 -> 3.0
等。
答案 2 :(得分:0)
就像beeender所说,Realm中的迁移发生了很大的变化,为我做一个领域(0.84.2)迁移的关键点是理解:
当您的应用具有不带的域数据库时,schemaVersion始终为0 指定schemaVersion。大多数情况下都是如此 一旦你开始在配置中开始使用schemaVersion 需要迁移&已经在运行您应用的实时版本。
schemaVersion会自动存储,当你的应用程序全新安装时,你已经在schemaVersion 3,realm 自动检查是否有异常,如果没有则设置 schemaVersion为3,因此在不需要时不会运行迁移。 这也意味着您不必再存储任何东西了 SharedPreferences。
在迁移中,当类型不可为空时,您必须设置新列的所有值,...
只能在列上设置convertColumnToNullable时插入空字符串