我在处理领域迁移块和迁移领域的策略时遇到了问题。
给定具有多个属性的对象MyObject:
给出了以下迁移块:
private class func getMigrationBlock(realmPath: String) -> RLMMigrationBlock {
return { migration, oldSchemaVersion in
if (oldSchemaVersion == RLMNotVersioned) {
NSLog("No database found when migrating.")
return
} else {
NSLog("Migrating \(realmPath) from version \(oldSchemaVersion) to \(RealmMigrationHelper.CURRENT_DATABASE_VERSION)")
}
NSLog("Upgrading MyObject from version %d to %d", oldSchemaVersion, CURRENT_DATABASE_VERSION)
if (oldSchemaVersion < 2) {
migration.enumerateObjects(MyObject.className(), block: {
oldObject, newObject in
newObject["myPropertyMk2"] = oldObject["myProperty"]
})
}
if (oldSchemaVersion < 3) {
migration.enumerateObjects(MyObject.className(), block: {
oldObject, newObject in
newObject["myPropertyMk3"] = oldObject["myPropertyMk2"]
})
}
NSLog("Migration complete.")
}
}当我是DB的第2版时,这个方法工作得很好(显然没有oldSchemaVersion < 3块),但是当我介绍第3版时,我开始遇到问题,因为它不识别oldSchemaVersion < 2块中的oldSchemaVersion。如果我将它更改为newObject"myPropertyMk3",它就会工作得很好。
通过阅读RLMMigration代码,这是非常有意义的,因为我们使用旧的schme和新方案,但基于realm.io上的文档,我认为这是没有意义的。那样的话,我就不会指望它是计划了。
我有一个想法,通过简单地使用字典,然后最后将该字典应用到newObject,从而减少块内的迁移。
对于处理这一问题的领域的迁移策略有什么想法吗?这是在领域网站上提到的,但只是非常简短。
谢谢您:)
发布于 2015-07-13 22:27:48
谢谢你的问题和报告你的问题。
通过阅读RLMMigration代码,这是非常有意义的,因为我们使用旧的schme和新方案,但基于realm.io上的文档,我认为这是没有意义的。那样的话,我就不会指望它是计划了。
正如您从RLMMigration中的代码中正确识别的那样,迁移不是无计划的。您提供的迁移闭包应该处理从过去的任何版本迁移到当前版本的。如果用户没有在中间更新应用程序,因此跳过了一个版本,则不可能,该领域可能会知道您的中间模式版本,因为模式会在运行时反映出来。您通常可以故意破坏与现有旧版本的向后兼容性,但是您需要注意将配置重置到定义的状态。
你说得对,这可以被更好地记录下来。我已经为此创造了一张内部罚单。
我有一个想法,通过简单地使用字典,然后最后将该字典应用到newObject中,从而减少块内的迁移。 对于处理这一问题的领域的迁移策略有什么想法吗?这是在领域网站上提到的,但只是非常简短。
根据您的方案和您拥有的数据量,您可以通过字典按对象在内存中对其进行重新组织,然后按照您的描述将其应用到newObject中。当前的API所作的假设相对较少,并且允许这样的方法。但是这样做对每个人都不是好事,例如,如果你有大量的相关对象列表的话。
https://stackoverflow.com/questions/31366641
复制相似问题