代码之家  ›  专栏  ›  技术社区  ›  Andy

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

  •  7
  • Andy  · 技术社区  · 8 年前

    我收到一封 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 回复  |  直到 8 年前
        1
  •  4
  •   Abdul Karim Khan    6 年前

    在我的情况下,我添加了条件,以便在新用户登录时进行检查:

    if newStudent == nil{
         self.realm.add(newStudent, update: .all)
    }
    
        2
  •  3
  •   Ignelio    8 年前
    try! self.realm.write {
        self.realm.add(newStudent, update: true)
    }
    

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

        3
  •  0
  •   Andy    8 年前

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

    我认为问题是之前的一个应用程序屏幕试图以实用程序服务质量将(同一个)学生对象保存到队列中,这意味着它在调用 realm.object(...) ,但在调用之前 realm.add(...) .

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