Al eliminar un objeto CoreData, ¿cómo eliminar también todos sus objetos relacionados en Swift5?

Nov 28 2020

Actualmente estoy trabajando con CoreData.

Problema: Tengo un CoreData Entidad usuario con una one-to-many-relationshipa otra Entidad CoreData Distintivos . Ahora estoy intentando eliminar un usuario y, obviamente, también me gustaría eliminar todas sus insignias .

Eliminar el usuario en sí es bastante sencillo:

context.delete(selectedUser)

Sin embargo, primero tengo que eliminar todas las insignias de usuario. Esta es la parte complicada para mí:

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

Al hacerlo, se produce este error: no se puede convertir el valor del tipo 'NSSet.Element' (también conocido como 'Cualquiera') al tipo de argumento esperado 'NSManagedObject'

Mi Posible solución: Yo estaba pensando en downcasting sencilla: context.delete(badge as! NSManagedObject). Sin embargo, no estoy seguro de que esto sea posible.

Pregunta: ¿Cuál es la mejor práctica para lograr el objetivo que describí anteriormente? ¿O tal vez hay una forma CoreData de eliminar de forma recursiva todos los Objetos relacionados?

Gracias por tu ayuda.

Respuestas

1 MartinR Nov 28 2020 at 18:20

selectedUser.badgeses una NSSetde Badges, por lo tanto, puede convertir sus elementos Badgeao para NSManagedObject:

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

También puedes lanzar el NSSeta su contraparte Swift Set:

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

Pero para eliminar todos los objetos relacionados si se elimina un usuario, la solución simple es establecer la "Regla de eliminación" para la relación en "Cascada".