Android Realm.io迁移:回退到.deleteRealmIfMigrationNeeded()

时间:2016-11-02 11:25:37

标签: android realm

将Android Realm.io实例迁移到较新的架构时,我在迁移实施中提供了迁移步骤:

  RealmConfiguration config = new RealmConfiguration
            .Builder(this)
            .schemaVersion(SCHEMA_VERSION)
            .migration(new Migration())
            .build();

我想在实际的迁移代码中做些什么,我希望为旧架构版本回退到deleteRealmIfMigrationNeeded

有没有办法做到这一点?我尝试使用deleteAll()进行此操作,但这似乎不起作用,因为有些人从旧版本的应用程序更新正在获得Realm验证错误。

public class Migration implements RealmMigration {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {

        if (oldVersion < 105) {
            realm.deleteAll();
            return;
        }

        //handle newer schema versions


    }
}

3 个答案:

答案 0 :(得分:5)

您可以尝试以动态模式打开Realm并询问它的版本。 DynamicRealms不会触发迁移:

RealmConfiguration config = new RealmConfiguration
            .Builder(this)
            .schemaVersion(SCHEMA_VERSION)
            .migration(new Migration())
            .build();

// Use DynamicRealm to find version and delete it if it is too old
DynamicRealm dRealm = DynamicRealm.getInstance(config);
boolean delete = dRealm.getVersion() < 42;
dRealm.close();
if (delete) {
  Realm.deleteRealm(config);
}

Realm realm = Realm.getInstance(config);

答案 1 :(得分:1)

要清除迁移中的类,可以删除Realm中的所有类,然后使用Realm使用的相同方法恢复类:

package io.realm;

public class Migration implements RealmMigration {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        RealmConfiguration configuration = realm.getConfiguration();
        if(oldVersion < 105) {
            RealmSchema schema = realm.getSchema();
            Set<RealmObjectSchema> classSchemas = schema.getAll();
            for(RealmObjectSchema classSchema : classSchemas) {
                schema.remove(classSchema.getClassName());
            }
        }
        Set<Class<? extends RealmModel>> currentModels = configuration.getRealmObjectClasses();
        Set<Class<? extends RealmModel>> nonExistentModels = new HashSet<>();
        for(Class<?> clazz : currentModels) {
            if(!schema.contains(clazz.getCanonicalName()) {
                nonExistentModels.put(clazz);
            } else {
                // TODO: migrate current classes that do exist
            }
        }

        for(Class<?> nonExistentClazz : nonExistentModels) {
            // partly taken from Realm 1.1.1's Realm.java : initializeRealm(Realm) method
            RealmProxyMediator mediator = configuration.getSchemaMediator(); // package internal
            mediator.createTable(modelClass, realm.sharedGroupManager.getTransaction()); // package internal
        }
    }
}

虽然公平,但这使用了包装内部魔法,而Christian Melchior的答案更简单,并且不依赖于这些神奇的东西。

另外,我直接在这里写了它,所以我实际上没有运行它。

答案 2 :(得分:0)

如何产生影响:

if(!isset($_POST['fieldName'])) {
    // throw exception or return error
}