【问题标题】:When deleting a CoreData Object, how to also delete all of its related Objects in Swift5?删除核心数据对象时,如何在 Swift 5 中同时删除其所有相关对象?
【发布时间】: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 方法可以递归删除所有相关对象?

感谢您的帮助。

【问题讨论】:

  • 只需将关系的“删除规则”设置为“级联”即可。比较stackoverflow.com/q/20528011/1187415
  • @MartinR 感谢您的回答。这确实工作得很好,而且比我的方法干净得多。只是为了兴趣:你可以将 NSSet.Element 转换为 NSManagedObject 吗?
  • 是的,你可以...
  • @MartinR 请随时将此作为您的答案发布,以便我接受。

标签: swift core-data entity nsmanagedobject nsset


【解决方案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)
}

但是为了在删除用户的情况下删除所有相关对象,简单的解决方案是将关系的“删除规则”设置为“级联”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 2011-03-17
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多