iphone - tutorial - Error de coherencia de Xcode: establecer la regla de eliminación de ninguna acción... es una configuración avanzada
xcode simulator (2)
Denegar Si hay al menos un objeto en el destino de la relación, entonces el objeto de origen no se puede eliminar. Por ejemplo, si desea eliminar un departamento, debe asegurarse de que todos los empleados de ese departamento se transfieran primero a otro lugar (¡o se los encienda!), De lo contrario, no se puede eliminar el departamento.
Anular Establecer la relación inversa para los objetos en el destino a nulo. Por ejemplo, si elimina un departamento, configure el departamento para todos los miembros actuales como nulo. Esto solo tiene sentido si la relación departamental para un empleado es opcional, o si se asegura de que establezca un nuevo departamento para cada uno de los empleados antes de la siguiente operación de guardado.
Cascade Elimina los objetos en el destino de la relación. Por ejemplo, si elimina un departamento, despida a todos los empleados de ese departamento al mismo tiempo.
Sin acción No le hagas nada al objeto en el destino de la relación. Por ejemplo, si elimina un departamento, deje a todos los empleados como están, incluso si aún creen que pertenecen a ese departamento.
Después de crear un modelo de datos en Xcode, arroja el siguiente error para cada una de las relaciones de objeto:
Consistency Error:
Setting the No Action Delete Rule on [object relationship] is an advanced setting
¿Qué intenta Xcode decirme y cómo debo responder?
Core Data usa relaciones inversas y elimina reglas para mantener el gráfico de objetos consistente
Digamos que tienes A.foo <1-1> B.bar y haz a.foo = b
. Esto realiza de manera automática (efectiva) b.bar = a
.
Ahora digamos que [b delete]
. Con la regla " b.bar.foo = nil
", efectivamente hace b.bar.foo = nil
. Con "cascade", lo hace [b.bar delete]
. Con "no acción", no hace nada; a.foo
ahora es una "referencia de objetos de datos centrales colgantes".
No es realmente un puntero colgante; las reglas de gestión de memoria estándar significan que b
seguirá existiendo en la memoria mientras que apunta hacia ella (hasta que a
convierta en una falla), pero a.foo
se referirá siempre a un objeto eliminado, lo que genera una excepción cuando intenta acceder a sus propiedades. No estoy seguro de qué pasa cuando guardas y recuperas a
.
Con una relación de muchos a muchos, se vuelve más complicado. Detalles de implementación: la relación parece ser "propiedad" de una de las entidades, y solo se guarda cuando se guarda esa entidad (acerté este error al intentar establecer una relación entre diferentes MOC: el MOC que guardó no era el propietario) la entidad actualizada, por lo que la relación nunca se guardó). Claramente, cuando eliminas tanto a
como b
, las relaciones también deben eliminarse, por lo que se supone que la relación desaparece, solo se elimina una de ellas (¡pero no sabes cuál!).
Probablemente quieras Anular o Cascada. Nunca uso Cascade porque nunca puedo recordar en qué dirección ocurre la cascada.