vez varios todos los golpe enlazados eliminar cómo contactos contacto como borrar iphone cocoa cocoa-touch core-data cascading-deletes

varios - eliminar contactos iphone 4 itunes



Datos principales de iPhone: eliminación en cascada en una relación de muchos a uno (2)

Tengo dos clases A y B con una relación muchos a uno de A a B (varios objetos A pueden hacer referencia al mismo B). La pregunta es, si la regla de eliminación en el lado A es Cascade, se eliminará B solo cuando se borre la última referencia A o se elimine la primera vez que se elimine una A asociada. La regla de eliminación para el lado B de la relación es Anular si eso es importante.

Además, leí en los documentos de Core Data que el indicador opcional importa en algunos casos. Pero no estaba claro cómo las relaciones que estaban ilustrando se relacionaban con mi caso. Hablaban de un caso de contención (B es propiedad de A) mientras que mi caso es de suscripción / asociación (B está relacionado con A).

Simplemente podía gestionar la eliminación de programas programáticamente en el código, pero quería permitir que Core Data hiciera lo correcto, si era posible. Pero no está claro que la semántica de recolección de basura que estoy buscando sea compatible con Core Data.

¿Alguna sugerencia?


Aquí hay una versión de Swift 4 de la respuesta de Lukas:

public override func prepareForDeletion() { guard let department = department else { return } if department.employees.filter({ !$0.isDeleted }).isEmpty { managedObjectContext?.delete(department) } }


Tenía el mismo objetivo que aparentemente tenía (elimine B tan pronto como se borre la última referencia A ). Me tomó más tiempo de lo esperado para hacerlo bien. Particularmente porque

  • En el momento en que A se prepara para la eliminación, es posible que la relación de muchos en B aún no se haya actualizado, por lo que no se puede contar simplemente el A al que se hace referencia en B.
  • isDeleted on A parece estar configurado durante -prepareForDeletion

Esto es lo que funcionó para mí si alguien está interesado (usaré Department <- >> Employee porque es más fácil de leer):

En empleado :

- (void)prepareForDeletion { // Delete our department if we we''re the last employee associated with it. Department *department = self.department; if (department && (department.isDeleted == NO)) { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isDeleted == NO"]; NSSet *employees = [department.employees filteredSetUsingPredicate:predicate]; if ([employees count] == 0) { [self.managedObjectContext deleteObject:department]; } } }

Otras personas han sugerido poner esta lógica en " -willSave en Departamento" . Prefiero la solución anterior, ya que en realidad podría querer guardar un departamento vacío en algunos casos (por ejemplo, durante la migración manual de la tienda o la importación de datos).