Realm Swift如何将Object从一个List移动至另一个List?
报错原因
Realm托管对象一旦被执行删除操作,会立即进入失效状态,不允许被重新添加到Realm中。你采用的「先删除对象再重新添加到目标分类」的逻辑,本质是操作已失效的对象,因此触发报错。
实际上Realm对象在不同关系列表间移动,完全不需要执行删除操作,直接修改关联关系即可实现,不需要创建属性完全一致的新对象。
正确实现方案
在同一个Realm写入事务中,先将对象从原所属分类的列表中移除,再将其追加到目标分类的列表中即可,全程操作同一个有效托管对象。
// 模型层建议添加反向链接,快速定位条目所属原分类 class ChecklistElement: Object { // 你的现有属性... // 反向关联所属分类 let parentSection = LinkingObjects(fromType: ChecklistSection.self, property: "sectionChecklist") } func moveChecklistItem(item: ChecklistElement, targetSection: ChecklistSection) { let realm = getRealm() do { try realm.write { // 从原分类列表中移除当前条目 if let originSection = item.parentSection.first { guard let itemIndex = originSection.sectionChecklist.index(of: item) else { return } originSection.sectionChecklist.remove(at: itemIndex) } // 将条目加入目标分类列表 targetSection.sectionChecklist.append(item) } } catch { print("条目移动失败: \(error.localizedDescription)") } }
注意事项
- 所有关系修改操作必须放在同一个
realm.write事务块中执行,不要拆分到多个独立事务处理 - 移动操作不会修改对象的主键值,其他引用该对象的关联关系会自动同步,不需要额外做数据更新
- 不要在写入事务外长期持有Realm托管对象的引用,避免对象意外失效导致操作报错
内容的提问来源于stack exchange,提问作者Andrey Stepanov
相关产品推荐
相关产品推荐

