iphone - tutorial - Coredata borra la confusión de reglas, xcode
nsmanagedobject swift 4 (2)
Tengo una relación de Datos centrales entre dos entidades, que es así:
Entity A Entity B
aRelationship <-------------->> bRelationship
Con la regla de eliminación establecida en cascada.
Tal vez tengo esto mal, pero pensé que si la regla de eliminación para estas dos relaciones se estableció en "Cascada", ¿cuándo se hizo lo siguiente ...
[context deleteObject:EntityA];
... también eliminaría todas las Entidades B asociadas con él. Sin embargo, cuando registro todas las entidades de mi B, parecería que estoy equivocado.
¿Podría alguien por favor arrojar algo de luz sobre mi confusión?
Muchas gracias.
Depende de qué reglas de eliminación estés usando.
Esto es lo que Apple dijo en su documento:
"Cuando elimina un objeto gestionado, es importante tener en cuenta sus relaciones y, en particular, las reglas de eliminación especificadas para las relaciones. Si todas las reglas de eliminación de relaciones de un objeto gestionado son Anula, entonces para ese objeto, al menos, no hay trabajo adicional que hacer (puede que tenga que considerar otros objetos que estaban en el destino de la relación; si la relación inversa era obligatoria o tenía un límite inferior de cardinalidad, entonces el objeto u objetos de destino podrían estar en un estado no válido). Si se elimina una relación regla es Cascade, luego eliminar un objeto puede resultar en la eliminación de otros. Si una regla es Denegar, entonces antes de eliminar un objeto debe eliminar el objeto de destino u objetos de la relación, de lo contrario obtendrá un error de validación cuando guarde Si una regla de eliminación es No Acción, debe asegurarse de tomar los pasos necesarios para garantizar la integridad del gráfico del objeto. "
El enlace de "Reglas para eliminar relaciones": http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW1
Si bien no es inmediatamente evidente en el editor de modelo de datos gráficos, cada relación recíproca, es decir, cada
<-->
... es realmente dos relaciones separadas, cada una con su propia regla de eliminación. Las reglas de eliminación se activan cuando se elimina un objeto de la entidad con la regla de eliminación.
Entonces, si en el editor de modelo de datos tiene dos entidades Alpha
y Beta
con una relación:
Alpha.betas<-->>Beta.alpha
... entonces realmente tienes dos relaciones así:
Alpha.betas--(delete rule)-->>Beta.alpha
Beta.alpha--(delete rule)-->Alpha.betas
Nunca desea configurar una regla de eliminación como esta:
Alpha.betas--(cascade)-->>Beta.alpha
Beta.alpha--(cascade)-->Alpha.betas
... porque al eliminar una instancia Beta
se eliminará el objeto Alpha
asociado que activará la eliminación de todos los objetos Beta
relacionados. Dependiendo de los detalles de su modelo de datos, una cascada recíproca puede eliminar una gran parte de sus datos por accidente.
Lo que realmente quieres es:
Alpha.betas--(cascade)-->>Beta.alpha
Beta.alpha--(nullify)-->Alpha.betas
Ahora, cuando eliminas el objeto Alpha
, eliminará todos los objetos Beta
asociados.
Cuando una cascada está bloqueada, generalmente es un problema con una relación requerida. No puedo decir con certeza sin detalles del modelo de datos.