升级 Swift Realm Braking Changes,我可以更改类名或如何解决冲突?
Posted
技术标签:
【中文标题】升级 Swift Realm Braking Changes,我可以更改类名或如何解决冲突?【英文标题】:Upgrade of Swift Realm Braking Changes, can I change a class name or how do I solve the conflict? 【发布时间】:2021-10-26 10:20:03 【问题描述】:我正在使用 Cocoa Pods 将 Realm 一个 ios Swift 应用程序从 5.5.1
更新到 10.12.0
。
此更新有一个重大更改 public typealias User = RLMUser
与我自己的 public final class User: Object
冲突。重构为另一个名称会使我的应用程序在读取此用户类时崩溃为assert(object.realm != nil)
。
是因为我重命名了我的班级,而领域数据库期待它的数据库中的旧名称吗?或者我应该在应用启动时进行某种合并?
或者我应该创建自己的分支来更改 Pod 中的“typealias User = RLMUser”?
【问题讨论】:
“重构为另一个名称会使我的应用程序崩溃”migration。 我建议您使用外观和协议,而不是具体的 Realm 对象与之交互。通过这种方式,您的代码可以非常安全地重构,而无需处理底层 Realm 对象。 @Sweeper 提供了一个很好的答案,但可能需要更多信息。看来这是一个同步的应用程序?如果是这种情况,迁移将不可用。此外,使用 Sync/10.x 与 5.x 时,整体文件结构也不同。你能澄清这是否是同步的吗?此外,您可以创建一个新的用户类 MyUserClass 并编写一些代码来将数据从旧类复制到新类,因此这是一个“手动”迁移。还有一个视图其他选项。 是的,我将弄清楚如何进行迁移或首先测试 @Sweeper 的覆盖建议。我没有使用 SyncUser,所以迁移或覆盖类名应该可以工作。 【参考方案1】:是因为我重命名了我的班级,而领域数据库期待它的数据库中的旧名称吗?
是的。您可以按照here 所述进行迁移来解决此问题,也可以覆盖_realmObjectName
:
class RenamedUser: Object
...
override class func _realmObjectName() -> String?
"User"
这样,对于 Realm,RenamedUser
仍然称为 User
,但对于 Swift,它称为 RenamedUser
。
【讨论】:
感谢清道夫。是的,我认为你的建议会奏效。一旦我在代码中实现了你的解决方案,我就会批准它:)以上是关于升级 Swift Realm Braking Changes,我可以更改类名或如何解决冲突?的主要内容,如果未能解决你的问题,请参考以下文章
Realm (Swift):如何在迁移期间获取 MutableSet 数据?