cocoa - Datos principales-existingObjectwith ID: error: causa el error 133000
core-data fault (4)
NSManagedObjectReferentialIntegrityError = 133000
NSManagedObjectReferentialIntegrityError Código de error para denotar un intento de disparar un error que apunta a un objeto que no existe. La tienda es accesible, pero el objeto correspondiente a la falla no se puede encontrar. Disponible en Mac OS X v10.4 y posterior. Declarado en CoreDataErrors.h.
Vea esta documentation .
Este tutorial puede ser útil para usted.
Entonces, la razón probable es que está tratando de recuperar el objeto que no existe. Esto sucede generalmente cuando intentas crear un objectid para un objeto no existente. El objectid le será devuelto y cuando intente obtener el objeto con este objectId se le arroja esta excepción.
Mi aplicación utiliza Core Data (con la ayuda de Magical Record) y está bastante multiproceso usando NSOperation
.
Por supuesto, tengo mucho cuidado de pasar solo NSManagedObjectID
entre hilos / operaciones.
Ahora, para volver al objeto gestionado correspondiente en una operación, uso -existingObjectWithID:error:
así:
Collection *owner = (Collection *)[localContext existingObjectWithID:self.containerId error:&error];
Pero lo que obtengo es nulo y el error
dice que es un error # 13300: NSManagedObjectReferentialIntegrityError
.
Esto es lo que dice la documentación sobre este error:
NSManagedObjectReferentialIntegrityError
Error code to denote an attempt to fire a fault pointing to an object that does not exist.
The store is accessible, but the object corresponding to the fault cannot be found.
Lo cual no es cierto en mi caso: ese objeto existe. De hecho, si repito todas las instancias de esa entidad Collection
con una NSFetchRequest
, la encuentro entre ellas, y su NSManagedObjectID
es exactamente la que pasé a -existingObjectWithID:error:
Además, si uso -objectWithID:
lugar, -objectWithID:
un objeto correcto muy bien.
Entonces hay algo que me estoy perdiendo. Aquí hay algunas observaciones / preguntas adicionales:
- "un objeto que no existe": ¿qué significa "existir" en esa oración? "existir" donde? Definitivamente "existe" en mi tienda Core Data en ese punto.
- "el objeto correspondiente a la falla no se puede encontrar": ¿qué significa "encontrado" en esa oración? "encontrado" donde? Definitivamente "se encontró" en mi tienda Core Data en ese momento.
Así que tal vez me falta algo con respecto a lo que existingObjectWithID:error:
¿verdad? La documentación dice:
If there is a managed object with the given ID already registered in the context, that object is returned directly; otherwise the corresponding object is faulted into the context.
[...]
Unlike objectWithID:, this method never returns a fault.
Esto no ayuda mi problema. No me importa que mi objeto esté completamente fallado, y no es un error. De hecho, cualquier falla dentro de ella disparará en la siguiente línea de código cuando acceda a las propiedades del objeto.
- ¿Cuál sería un escenario realista que conduzca a un
NSManagedObjectReferentialIntegrityError
?
Gracias por cualquier aclaración.
Cuando usa contextos múltiples, debe asegurarse de guardar el contexto A antes de pasar una ID de objeto administrado del contexto A a otro contexto B. Solo después de que se complete la tarea de guardado se podrá acceder a ese objeto desde el contexto B.
-objectWithID:
siempre devolverá un objeto no nulo, pero emitirá una excepción una vez que comience a usarlo si no hay un objeto de respaldo en la tienda. -existingObjectWithID:error:
ejecutará realmente algunos SQL y hará E / S si ese objeto no está ya registrado en el contexto en el que se utiliza.
El problema es que NSManagedObjectID
que pasa es temporal. Puede verificarlo llamando isTemporaryID
método isTemporaryID
. De documentos:
Devuelve un valor booleano que indica si el receptor es temporal.
La mayoría de los ID de objeto devuelven NO. A los objetos nuevos insertados en un contexto de objeto gestionado se les asigna una ID temporal que se sustituye por una permanente cuando el objeto se guarda en una tienda persistente.
Primero debe guardar sus cambios en la tienda persistente , solo luego obtenga una ID permanente para pasar a otro contexto.
Los he encontrado al tratar con una notificación NSManagedObjectContextDidSave. Muchos de los objetos que otro contexto había eliminado no se pudieron recuperar porque (¡Duh!) Se habían eliminado. Sin embargo, algunos de los objetos eliminados aparecieron muy bien, como los que ya había fallado en el contexto actual.
Podría tener un problema similar: los objetos que puede encontrar cuando itera en la tienda pueden haberse criticado en ese contexto antes de que se eliminen y no está fusionando los cambios a ese contexto, o simplemente no se ha fusionado aún.