2012-03-19 9 views
6

Empecé a usar CoreData en mi aplicación siguiendo las lecciones de Stanford CS193P sobre el uso de la nueva clase UIManagedDocument de iOS 5. El enfoque en sí es bastante sencillo, pero no puedo entender cómo lidiar con las modificaciones del modelo que sigo haciendo. Esta es la forma en que mi instanciar objetos UIManagedDocument (dentro de la AppDelegate, de manera que todas las demás clases puede usarlo):Problemas de migración con UIManagedDocument

if (!self.database) { 
    NSURL *url=[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:@"AppName"]; 

    UIManagedDocument *doc = [[UIManagedDocument alloc] initWithFileURL:url]; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 
    doc.persistentStoreOptions = options; 
    self.database=doc; 
    [doc release]; 
} 

El problema que tengo es que cada vez que cambia incluso un poco de mi .xcdatamodel, me no puedo obtener todo el contenido previamente almacenado en el documento ni crear ninguna instancia nueva. Como cuestión de hecho de esta manera genera la siguiente excepción:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.' 

pensé establecimiento de la "opciones" propiedad del documento administrado habría resuelto el problema, pero parece que esto no es suficiente. ¿Alguien puede ayudar? No pude 'encontrar otras preguntas que realmente se ajusten a mis necesidades precisas.

+0

Seguí Stanford CS193P también, y estoy experimentando el mismo error. – coolcool1994

Respuesta

2

Antes de modificar su modelo de Datos centrales, debe "Agregar versión de modelo".

1. Seleccione el archivo de modelo original. (por ejemplo, YourProject.xcdatamodel)

2. "Editor" -> "Agregar versión de modelo ...". A continuación, agregue una nueva versión de modelo (por ejemplo, 2.0)

3. Obtendrá un nuevo archivo de modelo. (por ejemplo, YourProject 2.0.xcdatamodel). Modificarlo

4. Cambie la versión del modelo actual. Seleccione el archivo .xcdtatmodel superior -> "Ver" -> "Utilidades" -> "Mostrar inspector de archivos". Busque la etiqueta "Modelo de datos básicos versionados" y elija la versión correcta que desee modificar.

También me molestó durante mucho tiempo. Espero que esto te ayude ^^

+0

Hola. Gracias por la respuesta. Parece que es el mejor camino por recorrer. De todos modos, después de seguir tu sugerencia, sigo recibiendo problemas de migración: *** Aplicación de finalización debido a la excepción no detectada 'NSInvalidArgumentException', razón: 'No se pueden combinar modelos con dos entidades diferentes llamadas' ManagedChild '' donde está ManagedChild una de las entidades en mi modelo. Encontré esta [entrada] (http://stackoverflow.com/questions/3205783/core-data-error-cant-merge-models-with-two-different-entities-named-foo) pero no usa el samy UIManagedDocument enfoque como necesito ... – micamoita

+0

Me sale el mismo problema. Toda la documentación dice que agregar el "persistentStoreOptions" es el camino a seguir. Pero recibo un retorno nulo de UIManagedDocument junto con los mismos mensajes de error. Eliminar la tienda no es una opción válida para mí, ya que estoy apoyando una aplicación lanzada. –

+0

Solo otro punto de datos ...Creé un proyecto de muestra que está inicializando Core Data a través de UIManagedDocument exactamente de la misma manera que lo estoy haciendo en mi aplicación, pero el proyecto de muestra parece migrar muy bien (incluso sin persistentStoreOptions). –

0

Hay una solución realmente simple para tu problema. Simplemente borre la aplicación del simulador o dispositivo (toque el icono de la aplicación durante unos segundos y toque la cruz que aparece cuando los iconos de la aplicación comienzan a moverse). De esta forma, Xcode actualiza el UIManagedDocument de su aplicación.

+1

y qué pasa si la aplicación ya está en la tienda. ¿muestra una vista de alerta y le pide a los usuarios que reinstalen su aplicación? – MrBr

+0

Creo que la respuesta de pH-k es lo que el interlocutor necesita ya que está siguiendo un tutorial, no para publicar una aplicación en la tienda :) – Philip007

+0

esto no me ayudó. La tienda persistente no está disponible, dice, ¡pero claramente lo tengo! – coolcool1994

0

Asegúrese de no confundir NSDocumentDirectory como NSDocumentationDirectory.

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 

NSDocumentDirectory is right!

Cuestiones relacionadas