RLMException尝试在检查后使用现有主键创建对象

时间:2018-02-28 09:51:28

标签: ios swift realm

由于以下原因,我收到了RLMException

  

尝试创建“'学生”类型的对象。与现有的   主键价值' 258975085-504336622-62850'。

令人困惑的部分是,在检查领域内没有现有对象时,它就会发生。

let realm = try Realm()
if let info = realm.object(ofType: Student.self, forPrimaryKey: newStudent.userId) {
    try realm.write {
        info.name = newStudent.name
        info.school = newStudent.school
        info.email = newStudent.email
    }
}
else {
    try realm.write {
        realm.add(newStudent) //RLMException occurs here
    }
}

此代码全部在do / catch块内的GCD实用程序队列上异步运行。它由用户界面中的按钮触发,但没有其他任何东西同时访问领域。

为什么if语句允许else代码运行?

3 个答案:

答案 0 :(得分:0)

try! self.realm.write {
    self.realm.add(newStudent, update: true)
}

您正在使用现有主键添加相同的对象(学生)。所以你可以更新当前的一个。而不是删除和添加新的。

答案 1 :(得分:0)

回答我自己的问题,因为我发现了问题。

我认为问题是之前的应用程序屏幕试图在具有Utility服务质量的队列中保存(相同)学生对象,这意味着它在调用realm.object(...)之后但在调用之前已完成保存realm.add(...)

在领域写入事务中移动if语句也有帮助(感谢EpicPandaForce)。

答案 2 :(得分:0)

就我而言,我添加了条件以检查新用户何时登录:

if newStudent == nil{
     self.realm.add(newStudent, update: .all)
}
相关问题