Android Realm.io迁移:回退到.DeleteRealMifMigrationRequired()
将Android Realm.io实例迁移到较新架构时,我在迁移实现中提供了迁移步骤:Android Realm.io迁移:回退到.DeleteRealMifMigrationRequired(),android,realm,Android,Realm,将Android Realm.io实例迁移到较新架构时,我在迁移实现中提供了迁移步骤: RealmConfiguration config = new RealmConfiguration .Builder(this) .schemaVersion(SCHEMA_VERSION) .migration(new Migration()) .build(); 对于较旧的架构版本,我希望在实际迁移代码
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
的值在您的代码中不会更改-它将始终是您初始化它时使用的值,它只是一个变量,它不会跟踪域的早期版本。