升级 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,我可以更改类名或如何解决冲突?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 过滤 Realm 对象

在 Swift 中设置 Realm 的位置

Realm (Swift):如何在迁移期间获取 MutableSet 数据?

在同一个项目中同时使用 Realm Swift 和 Realm Objective-C

Swift 中 Realm 查询的交叉引用谓词

在 iOS 7 上使用 Realm 和 Swift