我在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进行后续更新时,它似乎出错了。
如果我第一次调用将对象添加到Realm并使用update:true就可以了,但是感觉很糟糕。也许这是正确的方法?或者也许我错过了Realm的观点。是否将对象分配给另一个隐式尝试将对象添加到Realm?
谢谢
答案 0 :(得分:0)
这取决于您使用哪个API写入Realm。使用realm.add(_:update:)
并将update
设置为false将始终尝试将该对象添加为该对象和任何子对象的新副本。如果您有主键,它将触发您在上面看到的异常。如果您没有主键,它将添加该对象的整个第二个副本(您可能不需要它)。
realm.add(_:update: true)
主要用于REST API模式,您可能会不断从服务器更新对象,Realm可以在第一次智能地将对象添加到数据库,然后只需更新该对象在随后的电话中。
如果两个对象都已在Realm中,并且您知道不需要该添加或更新逻辑,则直接分配子对象而不是使用add
API可能更合适:< / p>
let realm = try! Realm()
let parentObject: ObjectA = ...
let childObject: ObjectB = ...
try! realm.write {
parentObject.objectReference = childObject
}