2011-08-22 20 views
27

que tiene una relación Núcleo de datos entre dos entidades, que es la siguiente:CoreData eliminar la confusión general, Xcode

Entity A      Entity B 
aRelationship <-------------->> bRelationship 

Con la norma de supresión establecido en cascada.

Tal vez tienen este mal, pero pensé que si la norma de supresión de estas dos relaciones se establece en "cascada", a continuación, cuando se hizo la siguiente ...

[context deleteObject:EntityA]; 

... lo haría también elimine 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 arrojar algo de luz sobre mi confusión?

Muchas gracias.

Respuesta

90

Aunque no es inmediatamente evidente en el editor de modelos de datos gráficos cada relación recipocal es decir, cada

<--> 

... es en realidad dos relaciones separadas cada una con su propia delet regla e Las reglas de eliminación se activan cuando se elimina un objeto de la entidad con la regla de eliminación.

lo tanto, si en el editor de modelos de datos tiene dos entidades Alpha y Beta con una relación:

Alpha.betas<-->>Beta.alpha 

... entonces realmente tener dos relaciones de este modo:

Alpha.betas--(delete rule)-->>Beta.alpha 
Beta.alpha--(delete rule)-->Alpha.betas 

You 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 de Beta se eliminará el objeto asociado Alpha que activará la eliminación de todos los objetos relacionados Beta. 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 quiere es:

Alpha.betas--(cascade)-->>Beta.alpha 
Beta.alpha--(nullify)-->Alpha.betas 

Ahora, cuando se elimina el objeto Alpha, se eliminarán todos los objetos asociados Beta.

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.

+0

Pregunta rápida, cuando ejecuto '[context deleteObject: EntityA];' esto asegurará que todas las betas se eliminen a la derecha, si lo tengo configurado como lo hizo en el último snipit de código? –

+0

Suponiendo que no haya algo más que bloquee la eliminación. – TechZen

+0

¿Pero qué sucede si borro todos los Betas? ¿Cómo hacer alfa eliminar automáticamente en tal caso? – shoumikhin

3

Depende de qué reglas de eliminación esté utilizando.

Esto es lo que dijo Apple en su documento:

"Cuando se elimina un objeto administrado es importante tener en cuenta sus relaciones y en particular las normas de supresión especificados para los relaciones Si de. las reglas de eliminación de relaciones del objeto gestionado son Anular, 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, luego th e destino objeto u objetos pueden estar en un estado no válido). Si una relación de eliminación es Cascade, eliminar un objeto puede dar como resultado la eliminación de otros . Si una regla es Denegar, antes de eliminar un objeto debe eliminar el objeto de destino u objetos de la relación , de lo contrario recibirá un error de validación al guardar. Si una regla de eliminación es de no acción, entonces debe asegurarse de que se tome medidas que sean necesarias para asegurar la integridad del gráfico de objetos "

El enlace de‘Relación eliminar reglas’:.. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW1