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
相关产品推荐
相关产品推荐

