因此,我们有一个用户拥有 1.0 版应用程序的场景。2.0版出来了,但是用户没有更新。当版本 3.0 出来时,用户决定更新。
因为用户还没有更新应用程序,领域文件也没有更新,所以在从 1.0 版迁移到 3.0 版时,version
参数 ofMigration.execute
的值将是 1 而不是 2。
当用户直接安装 2.0 版本的应用程序然后迁移到 3.0 版本时也会出现问题。和前一种情况一样,version
参数会出错。
有没有办法妥善处理这些情况?
因此,我们有一个用户拥有 1.0 版应用程序的场景。2.0版出来了,但是用户没有更新。当版本 3.0 出来时,用户决定更新。
因为用户还没有更新应用程序,领域文件也没有更新,所以在从 1.0 版迁移到 3.0 版时,version
参数 ofMigration.execute
的值将是 1 而不是 2。
当用户直接安装 2.0 版本的应用程序然后迁移到 3.0 版本时也会出现问题。和前一种情况一样,version
参数会出错。
有没有办法妥善处理这些情况?
实际上 Realm 的迁移示例显示了这种情况。
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 将首先运行。然后版本在 step 0 块中达到 1,然后 step 1 将运行。
------------ 用户直接安装版本 3 的更新案例 ------------
创建领域实例时,代码如下:
RealmConfiguration config = new RealmConfiguration.Builder(this)
.migration(migration)
.schemaVersion(3)
.build();
Realm realm = Realm.getInstance(config);
请注意schemaVersion(3)
这里。只有在需要迁移时才会RealmMigration.execute()
执行。这意味着如果用户直接安装版本 3 而没有在设备上安装任何以前的版本,则不会调用 并且在 Realm 文件初始化后,架构版本将设置为 3。RealmMigration.execute()
我不是Realm
大师,也没有Realm
在实际项目中使用过,但是这种方法应该有效:
假设您使用此迁移示例:
您需要保存在项目中的附加属性(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
。
就像beeender所说,Realm中的迁移发生了很大变化,对我来说使领域(0.84.2)迁移工作的关键点是理解:
当您的应用程序具有领域数据库但未指定 schemaVersion 时,schemaVersion 始终为 0。在大多数情况下这是正确的,因为一旦您需要迁移并且已经在运行您的应用程序的实时版本,您可能会开始在配置中使用 schemaVersion。
schemaVersion 会自动存储,当您的应用程序重新安装并且您已经在 schemaVersion 3 上时,领域会自动检查是否存在异常,如果没有,它将 schemaVersion 设置为 3,因此您的迁移不会在不需要时运行。这也意味着您不必再在 SharedPreferences 中存储任何内容。
在迁移中,当类型不可为空时,您必须设置新列的所有值,...
可以插入空字符串,但仅当在列上设置 convertColumnToNullable 时