如果用户跳过更新,如何处理域迁移

时间:2015-07-14 08:58:35

标签: android realm realm-migration

因此,我们有一个用户拥有应用版本1.0的场景。版本2.0出来了,但用户没有更新。当3.0版本出来时,用户决定更新。

由于用户尚未更新应用,因此领域文件也未更新,因此在从1.0版迁移到3.0版时,GCC C++ Compiler version参数的值将改为1 2.

当用户直接安装应用版本2.0然后迁移到3.0版时,也会出现问题。与前一种情况相同,Migration.execute参数将是错误的。

有没有办法妥善处理这些案件?

3 个答案:

答案 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.01.0 -> 2.02.0 -> 3.0等。

答案 2 :(得分:0)

就像beeender所说,Realm中的迁移发生了很大的变化,为我做一个领域(0.84.2)迁移的关键点是理解:

  • 当您的应用具有不带的域数据库时,schemaVersion始终为0 指定schemaVersion。大多数情况下都是如此 一旦你开始在配置中开始使用schemaVersion 需要迁移&已经在运行您应用的实时版本。

  • schemaVersion会自动存储,当你的应用程序全新安装时,你已经在schemaVersion 3,realm 自动检查是否有异常,如果没有则设置 schemaVersion为3,因此在不需要时不会运行迁移。 这也意味着您不必再存储任何东西了 SharedPreferences。

  • 在迁移中,当类型不可为空时,您必须设置新列的所有值,...

  • 只能在列上设置convertColumnToNullable时插入空字符串