CoreDataオブジェクトを削除する場合、Swift5で関連するすべてのオブジェクトも削除するにはどうすればよいですか?

Nov 28 2020

私は現在と協力していCoreDataます。

問題:別のCoreDataエンティティバッジを持つCoreDataエンティティユーザーがいます。現在、ユーザー削除しようとしていますが、明らかに、彼のバッジもすべて削除したいと思います。one-to-many-relationship

ユーザー自体の削除は非常に簡単です。

context.delete(selectedUser)

ただし、最初にすべてのユーザーバッジを削除する必要があります。これは私にとって複雑な部分です:

for badge in selectedUser.badges {
    context.delete(badge)
}

これを行うと、次のエラーが発生します。タイプ 'NSSet.Element'(別名 'Any')の値を予期される引数タイプ 'NSManagedObject'に変換できません

私の考えられる解決策:私は単純なダウンキャストを考えていました:context.delete(badge as! NSManagedObject)。しかし、これが可能かどうかはわかりません。

質問:上記の目標を達成するためのベストプラクティスは何ですか?または、関連するすべてのオブジェクトを再帰的に削除するCoreDataの方法はありますか?

ご協力いただきありがとうございます。

回答

1 MartinR Nov 28 2020 at 18:20

selectedUser.badgesSは、したがって、あなたがその要素をキャストすることができたりします。NSSetBadgeBadgeNSManagedObject

for badge in selectedUser.badges {
    context.delete(badge as! NSManagedObject)
}

NSSetSwiftの対応物にキャストすることもできますSet

for badge in selectedUser.badges as! Set<Badge> {
    context.delete(badge)
}

ただし、ユーザーが削除された場合に関連するすべてのオブジェクトを削除するには、関係の「削除ルール」を「カスケード」に設定するのが簡単な解決策です。