我有这个架构:
class A: Object {
var idA = ""
var b: B?
override class func primaryKey() -> String {
return "idA"
}
}
class B: Object {
var idB = ""
var name = ""
override class func primaryKey() -> String {
return "idB"
}
}
所以,如果我想保存A对象:
func updateA(a: A, b: B) {
do {
try realm.write {
a.b = b //Here i get the excepcion
realm.add(a, update: true)
}
} catch { error
}
}
当我呼叫更新时,我无法将b分配给a.b,我得到: ***由于未捕获的异常终止应用程序' RLMException',原因:'无法创建具有现有主键值的对象" bKey"。' 如果b对象已经存在于具有该主键的数据库中,那么我得到了它,但是如果它是一个新的对象则可以。我很久以前就确定这是按预期工作的 注意我想保存A更新B对象,如果其中一个属性已更改,如名称。我不想创建另一个B对象,只需使用已经传递的b对象。
答案 0 :(得分:0)
正如预期的那样,你正在添加已经创建的b
来创建一个类似的那个,这是不可能的,因为你已经拥有那个主键的b
您应该做的只是使用另一个新的a
创建b
,而不是先创建b
,然后再分配给a
答案 1 :(得分:0)
如果Object
尚未属于某个领域,则将其设置为子对象也会尝试将其添加到领域。在这种情况下,由于这似乎是b
的副本而不是对数据库中记录的直接引用,因此它被视为新记录,并且尝试添加冲突的主键。
如果您已在数据库中拥有b
的副本,则可以使用realm.object(ofType:forPrimaryKey:)
获取对该func updateA(a: A, b: B) {
do {
let bInDatabase = realm.object(ofType: B.self, forPrimaryKey: b.idB)
try realm.write {
a.b = bInDatabase
realm.add(a, update: true)
}
} catch { error }
}
的明确引用:
>>> class MyList(list):
... def pop(self, index=None):
... if index is None:
... try:
... index = min(enumerate(self), key=lambda x: x[1][1])[0]
... except ValueError:
... # allow for empty lists
... pass
... args = () if index is None else (index,)
... return super(MyList, self).pop(*args)
...
...
>>> L = MyList([[1,83],[2,7],[3,10]])
>>> L.pop()
[2, 7]
>>> L
[[1, 83], [3, 10]]