swift - 分配对象时出现 Realm 错误

标签 swift realm

我在我的 iOS 项目上使用 Realm 和 Swift。

我有一个 Realm 对象,它又包含对其他 Realm 对象的引用。我注意到一些奇怪的行为,设置引用将导致主键错误,如下所示:

 Terminating app due to uncaught exception 'RLMException', 
reason: 'Can't create object with existing primary key value '35834'.'

奇怪的是我只是设置一个引用。我有两个对象(ObjectA 和 ObjectB),每个对象都有自己的主键。

public class ObjectA: Object{
    dynamic public var objectReference:ObjectB?

当我第一次使用该 objectReference 执行此操作时,它工作正常。只是当我使用同一 objectReference 进行后续更新时,它似乎出错了。

如果我首先调用 update:true 将对象添加到 Realm 中,一切都可以,但这感觉很糟糕。也许这是正确的方法?或者也许我错过了 Realm 的一点。将一个对象分配给另一个对象是否会隐式尝试将该对象添加到 Realm 中?

谢谢

最佳答案

这取决于您使用哪个 API 来写入 Realm。使用 realm.add(_:update:) 并将 update 设置为 false 将始终尝试将该对象添加为该对象和任何子对象的新副本。如果您有主键,它将触发您在上面看到的异常。如果您没有主键,它将添加该对象的整个第二个副本(您可能也不想要)。

realm.add(_:update: true) 的要点主要针对 REST API 模式,您可能会不断从服务器更新对象,Realm 可以智能地将对象添加到第一次访问数据库,然后在后续调用中简单地更新该对象。

如果两个对象都已在 Realm 中,并且您知道不需要添加或更新逻辑,则直接分配子对象而不是使用 add 可能更合适API:

let realm = try! Realm()

let parentObject: ObjectA = ...
let childObject: ObjectB = ...

try! realm.write {
   parentObject.objectReference = childObject
}

关于swift - 分配对象时出现 Realm 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43332850/

相关文章:

swift - 我如何从嵌入在 UITableViewCell (Swift) 中的 UICollectionView 的单元格中分离出来?

arrays - 如何在 Swift 中从数组中删除元素

ios - 获取不可见的 CollectionView 单元格

ios - SwiftUI 中的 ForEach TextField

android - 如果我在Android中使用协程读写Realm以避免阻塞UI,是否还需要使用后台线程?

swift - 在 Swift 中通过 CocoaPods 安装 Realm

swift - 使用 Realm Swift 进行 NSPredicate 过滤

iOS崩溃: Unable to open a realm at Path

ios - 将 Realm 与 Crashlytics 结合使用时的 NSUncaughtExceptionHandler

swift - 按钮不显示在模拟器中