Podczas usuwania obiektu CoreData, jak również usunąć wszystkie powiązane z nim obiekty w Swift5?

Nov 28 2020

Obecnie pracuję z CoreData.

Problem: Mam użytkownika jednostki CoreData z odznakione-to-many-relationship do innej jednostki CoreData . Próbuję teraz usunąć użytkownika i oczywiście chciałbym również usunąć wszystkie jego odznaki .

Usunięcie samego użytkownika jest dość proste:

context.delete(selectedUser)

Jednak najpierw muszę usunąć wszystkie odznaki użytkownika. To jest dla mnie skomplikowana część:

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

W takim przypadku występuje ten błąd: nie można przekonwertować wartości typu „NSSet.Element” (aka „Any”) na oczekiwany typ argumentu „NSManagedObject”

Moja Możliwe rozwiązanie: Myślałam o prostym rzutowanie w dół: context.delete(badge as! NSManagedObject). Nie jestem jednak pewien, czy jest to możliwe.

Pytanie: Jaka jest najlepsza praktyka, aby osiągnąć cel, który opisałem powyżej? A może istnieje sposób CoreData na rekurencyjne usuwanie wszystkich powiązanych obiektów?

Dzięki za pomoc.

Odpowiedzi

1 MartinR Nov 28 2020 at 18:20

selectedUser.badgesjest NSSetod Badges, dlatego możesz rzutować jego elementy na Badgelub do NSManagedObject:

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

Możesz także rzucić na NSSetjego odpowiednik w wersji Swift Set:

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

Aby jednak usunąć wszystkie powiązane obiekty w przypadku usunięcia użytkownika, prostym rozwiązaniem jest ustawienie „Reguły usuwania” dla relacji na „Kaskada”.