领域:如果对象的一个​​属性是已存在的另一个对象,则无法更新对象

时间:2016-11-10 11:26:07

标签: ios objective-c realm

我有这个架构:

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对象。

2 个答案:

答案 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]]