【问题标题】:RLMException attempting to create object with an existing primary key after checkRLMException 在检查后尝试使用现有主键创建对象
【发布时间】:2023-03-10 07:59:02
【问题描述】:

我收到RLMException 的原因如下:

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

令人困惑的部分是它发生在检查 Realm 中没有具有此键的现有对象之后。

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
    }
}

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

为什么那个 if 语句可以让 else 代码运行?

【问题讨论】:

  • 您为什么不将 userId 写入领域以获取新对象?
  • 我的 userId 是 Student 对象的一部分,所以如果它可以找到一个具有匹配 id 的对象,那么它不需要再次写入 id,如果我正在创建一个它,它就会包含在模型中新对象。
  • 您是否尝试打印 newStudent.userId 的值?是“258975085-504336622-62850”吗?
  • 是的,就是这样。我对为什么在开始时对该 id 的对象调用不会返回它感到更加困惑

标签: ios swift realm


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    try! self.realm.write {
        self.realm.add(newStudent, update: true)
    }
    

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

    【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 这就是为什么你应该在交易中检查而不是写两个不同的realm.write
    猜你喜欢
    • 2020-10-07
    • 2018-03-14
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多