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

Android Realm.io迁移:回退到.DeleteRealMifMigrationRequired(),android,realm,Android,Realm,将Android Realm.io实例迁移到较新架构时,我在迁移实现中提供了迁移步骤: RealmConfiguration config = new RealmConfiguration .Builder(this) .schemaVersion(SCHEMA_VERSION) .migration(new Migration()) .build(); 对于较旧的架构版本,我希望在实际迁移代码

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

  RealmConfiguration config = new RealmConfiguration
            .Builder(this)
            .schemaVersion(SCHEMA_VERSION)
            .migration(new Migration())
            .build();
对于较旧的架构版本,我希望在实际迁移代码中执行的操作回退到
deleteRealMifMigrationRequired

有办法吗?我试着用
deleteAll()
来做,但这似乎不起作用,因为有些人从较旧版本的应用程序更新时会出现领域验证错误

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


    }
}
公共类迁移实现了RealmMigration{
@凌驾
public void migrate(dynamicrelm领域、long oldVersion、long newVersion){
如果(旧版本<105){
realm.deleteAll();
返回;
}
//处理较新的架构版本
}
}

关于以下方面的内容如何:

    final RealmConfiguration.Builder builder=new RealmConfiguration.Builder(this);
    builder.schemaVersion(SCHEMA_VERSION);
    if (SCHEMA_VERSION < 105) {
       builder.deleteRealmIfMigrationNeeded();
    } else {
       builder.migration(new Migration());
    }
    final RealmConfiguration config = builder.build();

final RealmConfiguration.Builder=new RealmConfiguration.Builder(此);
schemaVersion(SCHEMA_版本);
如果(模式_版本<105){
builder.deleteRealMifMigrationRequired();
}否则{
builder.migration(新的migration());
}
最终RealmConfiguration config=builder.build();

您可以尝试在动态模式下打开一个领域,并询问其版本。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);
RealmConfiguration config=新的RealmConfiguration
.Builder(本)
.schemaVersion(SCHEMA_版本)
.migration(新的migration())
.build();
//使用DynamicRealm查找版本,如果版本太旧,则将其删除
dynamicrelm dRealm=dynamicrelm.getInstance(配置);
布尔删除=dRealm.getVersion()<42;
dRealm.close();
如果(删除){
deleteRealm(配置);
}
Realm Realm=Realm.getInstance(配置);

要清除迁移中的类,可以删除域中的所有类,然后使用域使用的相同方法还原类:

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
        }
    }
}
package io.realm;
公共类迁移实现了重新迁移{
@凌驾
public void migrate(dynamicrelm领域、long oldVersion、long newVersion){
RealmConfiguration配置=realm.getConfiguration();
如果(旧版本<105){
RealmSchema schema=realm.getSchema();
Set classSchemas=schema.getAll();
for(RealmObjectSchema类schema:classSchema){
schema.remove(classSchema.getClassName());
}
}

你说的“退路”是什么意思要在旧版本上
删除RealMifMigrationRequired
?迁移的全部目的是为了能够升级旧版本?@ChristianMelchior,我的意思是我不想为所有旧版本编写迁移。这个应用程序有一个很长的遗留问题,我们只想支持几个最新版本的迁移现在(并保持迁移脚本的最新状态以备将来使用)。在我们现有的时间范围内,不可能为所有从未为其编写过迁移的旧版本编写迁移。因此,我只想擦除整个数据库,就好像我们在这些情况下调用DeleteRealMifMigrationRequired,但在较新的情况下进行迁移一样。我需要以前的架构版本。您知道我是否在调用生成器之前以某种方式获取旧的架构版本?在我的脑海中:构建RealmConfiguration只是为了读取版本:
long currentVersion=new RealmConfiguration.builder(this).getSchemaVersion()
new RealmConfiguration.builder(this).build().getSchemaVersion()每次都返回0..:-(奇怪的是,此解决方案与正在运行的解决方案之间的区别在于,
SCHEMA\u VERSION
的值在您的代码中不会更改-它将始终是您初始化它时使用的值,它只是一个变量,它不会跟踪域的早期版本。