2010-06-20 15 views
7

diseño de aplicaciones básicas utilizando la plantilla de control de navegación con fecha de núcleo:traiga datos básicos solicitud falla con: 'NSInternalInconsistencyException', razón: 'declaración es todavía activo'

Delegado: persistenceCoordinator, managedObjectModel, managedObjectContext

  • RootView: managedObjectContext (de delegado), addManagedObjectContext (utilizando el patrón de las plantillas), fetchResultsController
    • Agregar/Editar vista (una jerarquía para añadir objeto a & su B)

Tengo dos objetos, A & B que comparten un/relación inversa relación 1-a-1

Utilizando el patrón de las plantillas de la aplicación:

  1. Crea un addManagedObjectContext
  2. inserta un una entidad
  3. empuja sobre la opción Agregar/Editar una vIE w (habiendo pasado que la entidad insertada)

EXCEPCIÓN los pasos 1:

Si yo simplemente llene los atributos A y guardar todo funciona bien.

  • El objeto se inserta en la base de datos (verificado con sqlite3 en la línea de comandos)
  • Las actualizaciones fetchResultsController la vista de lista
  • puedo cerrar y abrir la aplicación (completo de apertura/cierre no sólo interruptor de aplicación) y la vista de lista se volverá a ir a buscar correctamente

si yo Editar a, puedo seleccionar Añadir B y una vista complemento B es empujado en (Y pasado la entidad A)

  • Rellene B detalles y guardar el
  • se inserta B dentro de un managedObjectContext, la relación se fija, y el contexto se guarda
  • La vista se dispara y todo parece así
  • los objetos son a la vez en la base de datos con la relación correcta
  • puedo recargar el registro y ver la relación, hacer ediciones etc
  • excepción: si cierro/vuelva a abrir la aplicación, con el fin de activar una extracción, entonces el error mencionado en ocurrirá el título.

EXCEPCIÓN los pasos 2:

Si lleno en la A atributos y el B atributos en el inicial "añadir"

  • Ahorro B desencadena un completo Guardar del contexto de un (como antes)
  • ahorro Una salva a través de la relación de delegado establecido por la plantilla (y se funde el resultado en el principal managedObjectContext etc)
  • Los objetos se insertan en la base de datos correctamente
  • Sin embargo, el fetchResultsController no se actualiza para mostrar los nuevos registros
  • excepción: si cierro/vuelva a abrir la aplicación, con el fin de activar una extracción, entonces el se menciona el error mencionado en el título .

He intentado guardar A primero, agregando un contexto separado para B, etc. Estoy confundido por decir lo menos. Cualquier ayuda sería muy apreciada.

Saludos, Ryan

Respuesta

4

Suena como que tiene dos o más contexto de objeto gestionado cuando sólo se necesita uno.

No sé por qué tendrías un método llamado addManagedObjectContext en RootViewController o lo que haría. En todos los diseños excepto en los más complejos, solo tiene un contexto a la vez y no se superponen. El/los contexto/s deben ser retenidos por el delegado de la aplicación o un objeto modelo dedicado. Nunca crearía un contexto nuevo cada vez que abra una vista en particular.

Puede escribir en contexto diferente escribiendo en la misma tienda persistente, así que creo que esta es la razón por la que está viendo los datos en la tienda. Sin embargo, no puede mantener la integridad del gráfico en el contexto si coloca un objeto en una relación en un contexto y el otro lado de la relación en otro contexto. Creo que esto es lo que está produciendo tu error.

+0

Tener un contexto de adición mantiene todos los cambios fuera del contexto principal hasta que los combines. Es perfectamente razonable. El problema era un problema de subprocesamiento con uno de mis objetos administrados. Un error tonto no relacionado con los contextos o el flujo de la aplicación. Gracias de todos modos. Aprecio los pensamientos. –

+0

Disculpe, siguiendo el nombre del método, pensé que estaba "agregando otro contexto" y no tenía "un contexto para agregar objetos". Para el beneficio de futuros lectores, es posible que desee editar su pregunta para reflejar eso. – TechZen

+1

Tener más de un contexto solo para tirar los objetos es, en el mejor de los casos, un caso de ** edge ". No es "perfectamente razonable", pero desafortunadamente un mal ejemplo existe en uno de los proyectos fuente de ejemplo de Apple. 'NSUndoManager' es lo que se debe usar para descartar situaciones. –

3

Este error generalmente está relacionado con el subprocesamiento y probablemente significa que algo está procesándose en otro subproceso. En mi caso, estaba haciendo algo estúpido en el init de un objeto gestionado (no anulé init;)).

+1

Este fue mi problema, a pesar de que mi enhebrado era correcto, estaba anulando el método de inicialización de un NSManagedObject que estaba rompiendo cosas. – BenV

Cuestiones relacionadas