删除核心数据对象时,如何在 Swift 5 中同时删除其所有相关对象?
Posted
技术标签:
【中文标题】删除核心数据对象时,如何在 Swift 5 中同时删除其所有相关对象?【英文标题】:When deleting a CoreData Object, how to also delete all of its related Objects in Swift5? 【发布时间】:2020-11-28 10:44:29 【问题描述】:我目前正在使用CoreData
。
问题:我有一个 CoreData 实体用户,其 one-to-many-relationship
指向另一个 CoreData 实体徽章。我现在正在尝试删除一个用户,显然,我还想删除他的所有徽章。
删除用户本身非常简单:
context.delete(selectedUser)
但是我必须先删除所有用户的徽章。这对我来说是复杂的部分:
for badge in selectedUser.badges
context.delete(badge)
这样做时,会出现以下错误:无法将类型“NSSet.Element”(又名“Any”)的值转换为预期的参数类型“NSManagedObject”
我可能的解决方案:我正在考虑简单的向下转换:context.delete(badge as! NSManagedObject)
。但是我不确定这是否可能。
问题:实现上述目标的最佳实践是什么?或者是否有一种 CoreData 方法可以递归删除所有相关对象?
感谢您的帮助。
【问题讨论】:
只需将关系的“删除规则”设置为“级联”即可。比较***.com/q/20528011/1187415。 @MartinR 感谢您的回答。这确实工作得很好,而且比我的方法干净得多。只是为了兴趣:你可以将 NSSet.Element 转换为 NSManagedObject 吗? 是的,你可以... @MartinR 请随时将此作为您的答案发布,以便我接受。 【参考方案1】:selectedUser.badges
是Badge
s 的NSSet
,因此您可以将其元素转换为Badge
或NSManagedObject
:
for badge in selectedUser.badges
context.delete(badge as! NSManagedObject)
您还可以将 NSSet
转换为 Swift 对应的 Set
:
for badge in selectedUser.badges as! Set<Badge>
context.delete(badge)
但是为了在删除用户的情况下删除所有相关对象,简单的解决方案是将关系的“删除规则”设置为“级联”。
【讨论】:
以上是关于删除核心数据对象时,如何在 Swift 5 中同时删除其所有相关对象?的主要内容,如果未能解决你的问题,请参考以下文章