将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
}
}
答案 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
}