gpt4 book ai didi

Realm 模型迁移策略

转载 作者:行者123 更新时间:2023-12-02 10:45:07 25 4
gpt4 key购买 nike

我在使用 Realm 迁移 block 和迁移 Realm 策略时遇到了问题。

给定一个具有多个属性的对象 MyObject:

  • 在版本 1 中,我们有属性 myProperty
  • 在版本 2 中,我们将属性更改为 myPropertyMk2
  • 在版本 3 中,我们将属性更改为 myPropertyMk3

给定以下迁移 block :

    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.")
}
}

当我是数据库的版本 2 时,这工作得很好(显然没有 oldSchemaVersion < 3 block ),但是当我引入版本 3 时,我开始遇到问题,因为它无法识别 <oldSchemaVersion <2 block 中的strong>newObject["myPropertyMk2"]。如果我将其更改为 newObject["myPropertyMk3"] 它就可以正常工作。

从阅读 RLMMigration 代码来看,当我们使用旧的 schme 和新的方案时,这是非常有意义的,但根据realm.io 上的文档,我认为它没有意义。那么我本以为它会少一些计划。

我有一个想法,通过简单地使用字典来减少 block 内的迁移,然后最终将该字典应用于newObject

对于处理这个问题的 Realm 迁移策略有什么想法吗? Realms 网站上提到了它,但只是非常简短。

谢谢:)

最佳答案

感谢您提出问题并报告您的问题。

From reading the RLMMigration code this makes perfectly good sense as we work with the old schme and the new scheme, but based on the documentation on realm.io I do not think it makes sense. Then I would have expected it to be scheme less.

正如您从 RLMMigration 中的代码中正确认识到的那样,迁移并不是无方案的。您提供的迁移闭包应该处理从过去的任何版本到当前版本的迁移。如果您的用户在中间没有更新您的应用程序,因此跳过了一个版本,那么 Realm 就不可能知道您的中间架构版本,因为该架构是在运行时反射(reflect)的。通常,您可以故意破坏与现有旧版本的向后兼容性,但需要小心地将配置重置为定义的状态。

您的观点肯定是正确的,这可以更好地记录下来。我已经为此创建了一个内部票证。

I have an idea about making a scheme less migration within the block by simply using a dictionary and then finally apply this dictionary to the newObject.

Are there any thoughts on the migration strategy of realms that deals with this? It is mentioned on realms website, but only very briefly.

根据您的方案和您拥有的数据量,您可以通过字典在内存中按对象方式重新组织它,然后按照您的描述将其应用到 newObject 。当前的 API 做出的假设相对较少,并且允许使用这样的方法。但它不会以这种方式对每个人都有好处,例如如果您有大量相关对象的列表。

关于 Realm 模型迁移策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31366641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com