我在我的 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/