Wie kann man beim Löschen eines CoreData-Objekts auch alle zugehörigen Objekte in Swift5 löschen?

Nov 28 2020

Ich arbeite gerade mit CoreData.

Problem: Ich habe einen CoreData Entity- Benutzer mit einem one-to-many-relationshipzu einem anderen CoreData Entity- Abzeichen . Ich versuche jetzt, einen Benutzer zu löschen und möchte natürlich auch alle seine Abzeichen löschen .

Das Löschen des Benutzers selbst ist ziemlich einfach:

context.delete(selectedUser)

Ich muss jedoch zuerst alle Benutzerausweise löschen. Dies ist der komplizierte Teil für mich:

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

Dabei tritt folgender Fehler auf: Der Wert vom Typ 'NSSet.Element' (auch bekannt als 'Any') kann nicht in den erwarteten Argumenttyp 'NSManagedObject' konvertiert werden.

Meine mögliche Lösung: Ich dachte an einfaches Downcasting : context.delete(badge as! NSManagedObject). Ich bin mir jedoch nicht sicher, ob dies möglich ist.

Frage: Was ist die beste Vorgehensweise, um das oben beschriebene Ziel zu erreichen? Oder gibt es eine CoreData-Methode, um alle zugehörigen Objekte rekursiv zu löschen?

Danke für Ihre Hilfe.

Antworten

1 MartinR Nov 28 2020 at 18:20

selectedUser.badgesist ein NSSetvon Badges, daher können Sie seine Elemente zu Badgeoder zu NSManagedObject:

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

Sie können das auch NSSetauf das Swift-Gegenstück übertragen Set:

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

Um jedoch alle zugehörigen Objekte zu löschen, wenn ein Benutzer gelöscht wird, besteht die einfache Lösung darin, die "Löschregel" für die Beziehung zu "Kaskade" festzulegen.