删除核心数据对象时,如何在 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.badgesBadges 的NSSet,因此您可以将其元素转换为BadgeNSManagedObject

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 中同时删除其所有相关对象?的主要内容,如果未能解决你的问题,请参考以下文章

SWIFT 的核心数据:如何从关系实体中删除对象?

使用 Swift 3 删除核心数据托管对象

如何在 Swift 2.0 中滑动删除核心数据表视图

如何在核心数据swift 3中同时保存和获取

如何从数据数组中删除对象(核心数据)

如何在 Swift 的 NSCoding 初始化中返回预先存在的核心数据对象?