You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RLMException异常排查:无法将Person类型赋值给Person属性

Realm更新Job时抛出RLMException的原因及解决办法

核心原因

这个异常的本质是:你要赋值给Job的Person对象,和当前待更新的Job对象不属于同一个Realm实例(或处于不同线程的Realm上下文)。Realm的对象是绑定到所属Realm实例的,哪怕类型完全一致,跨实例的对象也无法直接关联赋值。

另外还有一种可能:你选中的Person是未被Realm管理的游离对象(比如直接用Person(name: "")初始化但没写入Realm)——创建Job时可能是同时将Person和Job写入Realm,所以没问题,但更新时单独给Job赋值游离对象就会触发错误。

对应解决方案

1. 跨Realm实例/线程场景

如果Person是从其他线程的Realm查询得到,或是来自不同的Realm实例,需要从当前Job所在的Realm中,通过主键重新获取对应的Person对象再赋值:

// 假设currentRealm是当前Job所属的Realm实例
guard let selectedPersonId = selectedPerson?.id,
      let managedPerson = currentRealm.object(ofType: Person.self, forPrimaryKey: selectedPersonId) else {
    return
}

try! currentRealm.write {
    job.assigned = managedPerson
}

2. 游离对象场景

如果选中的Person还没被Realm管理,先将其写入当前Job所在的Realm,再进行赋值:

try! currentRealm.write {
    guard let selectedPerson = selectedPerson else { return }
    currentRealm.add(selectedPerson)
    job.assigned = selectedPerson
}

注意事项

  • 所有Realm对象的修改必须在write事务内执行,更新Job时务必遵守这个规则。
  • 不同线程之间不要直接传递Realm对象,优先传递主键值,再在目标线程的Realm中重新查询获取对象。

内容的提问来源于stack exchange,提问作者Chris Read

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:50:06