2010-07-27 10 views
20

Este es el código del método toggleAddProject, el código de Core Data es casi el mismo que el encontrado en el ejemplo de CoreDataBooks de Apple, sin embargo, cuando hago clic en el botón Agregar la aplicación se bloquea con entityForName: could not locate an NSManagedObjectModel for entity name 'Project' en la línea con newProjectController.projectno pudo ubicar un NSManagedObjectModel para el nombre de entidad

-(IBAction)toggleAddProject 
{ 
    NewProjectViewController *newProjectController = [[[NewProjectViewController alloc] initWithStyle:UITableViewStyleGrouped] autorelease]; 

    // Create a new managed object context for the new project -- set its persistent store coordinator to the same as that from the fetched results controller's context. 
    NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init]; 
    self.addingManagedObjectContext = addingContext; 
    [addingManagedObjectContext setPersistentStoreCoordinator:[[fetchedResultsController managedObjectContext] persistentStoreCoordinator]]; 
    newProjectController.project = (Project *)[NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:addingContext]; 
    [addingContext release]; 


    UINavigationController *addNewNavigationController = [[UINavigationController alloc] initWithRootViewController:newProjectController]; 
    [self.navigationController presentModalViewController:addNewNavigationController animated:YES]; 
    [addNewNavigationController release]; 
} 

Todo se ha sintetizado, existe la entidad del proyecto. No puedo entender por qué se bloquea. La mayoría de las personas parecen ser capaces de corregir este error mediante la inserción del código siguiente, ya sea en el propio método, o en viewDidLoad:

if (managedObjectContext == nil) 
{ 
    managedObjectContext = [(CoreDataBooksAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
} 

Cuando modificado para mi aplicación delegado no hace ninguna diferencia. Gracias por cualquier ayuda.

Respuesta

40

Este error tiene sólo unas pocas fuentes posibles:

  1. error tipográfico en el nombre de la entidad.
  2. Objeto de objeto de objeto administrado nulo.
  3. No se ha agregado el modelo que contiene la entidad al almacén persistente que utiliza el contexto.
  4. No se ha agregado la tienda persistente correcta al contexto.
+0

Terminé acercándome a esto de manera diferente y este error no aparece ahora. Pero gracias de todos modos, no había errores ortográficos en mi código, pero estoy seguro de que fue una de las otras cosas que enumeró, probablemente el moc sea nulo. – ChrisJP

+0

4. fue el problema en mi caso –

2

Los documentos de Apple dan buena información sobre la depuración del error entityForName: could not locate an NSManagedObjectModel for entity name 'Foo'.

Consulte la sección this de la Guía de programación de datos básicos.

+1

Sí, he visto esto pero no he podido resolver el problema, de ahí mi publicación aquí. – ChrisJP

+1

Welp, tenga un voto favorable para mirar los documentos ya en ese momento. :) – jergason

3

Utilice el depurador y confirme que su modelo no es nulo. Esa es la causa más común de este error. Si no es nada nulo, busque un error tipográfico en el nombre de la entidad.

1

Ok, me encontré con este problema también y lo resolví de este modo. El código original fue dada como:

Event *event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:managedObjectContext]; 

Mientras que el código es conciso parece que el depurador no puede mostrar información más detallada acerca de dónde está el error, ya que ambos están Crear y configurar una nueva instancia de la 'Evento 'entidad (o como se llame su Entidad).

En lugar de eso estalló esta en tres líneas y el depurador se muestra mucha más información:

Event *event = [[NSManagedObject alloc] init]; 
NSManagedObjectContext *moc = [self managedObjectContext]; 
event = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:moc]; 

descubrí que no había puesto el tipo correcto para uno de los atributos y tuve un error en mi código , todo lo cual el depurador señaló.

23

Tuve este problema cuando tenía varios NSManagedObjectContext s diferentes. La forma más rápida de depurarlo fue inspeccionar los diferentes bits de conexión y asegurarme de que mi entidad estaba en la lista antes de llamar al contexto.

NSLog(@"Context: %@",context); 
NSLog(@"PS Coord : %@",context.persistentStoreCoordinator); 
NSLog(@"MOM : %@", context.persistentStoreCoordinator.managedObjectModel); 
NSLog(@"Entities : %@",[[context.persistentStoreCoordinator.managedObjectModel entities] valueForKey:@"name"]); 
+2

Con mucho, la mejor solución para resolver el problema. Esto solo me ayuda a descubrir que mi persistentStoreCoordinator no está conectado correctamente. – ArtSabintsev

+1

Bingo !! Todavía no he resuelto mi problema, pero esto ciertamente me lleva por el camino correcto. – Rickster

-1

TechZen es perfecto ... en mi caso fue # 4. Siga los pasos en el siguiente enlace y esto le ayudará a agregar los métodos CoreData apropiados en un proyecto existente y configurar todo correctamente para que no se encuentre con el error que está teniendo.

Adding Core Data To Existing iPhone Projects

+0

Obtuve un 404 en este recurso ... –

+1

Aquí hay un enlace que funciona: http://wiresareobsolete.com/wordpress/2009/12/adding-core-data-existing-iphone-projects/ –

0

Durante mi desarrollo, no pude encontrar entidades que he añadido más tarde. Lo que funcionó para mí: (Básicamente una punta de cordura)

Desinstalar la aplicación CADA VEZ que cambie el modelo de datos!

El modelo de datos se almacena en caché por Core Data entre las instalaciones, para garantizar que la integridad se mantenga intacta. Elimina la aplicación del simulador/iPhone para poder probar tus cambios.

PD: ¿Alguien sabe cómo hacerlo automáticamente?

+0

Se supone que debe usar migraciones ligeras para resolver esto. Aquí hay una breve publicación de blog que explica esto: http://blog.the-nerd.be/2012/02/how_to_do_a_lightweight_core_data_migration/ Aquí hay una publicación de blog más detallada: http://www.raywenderlich.com/27657/how-to -perform-a -weight-core-data-migration –

+0

"Cada vez que actualiza algo en su modelo, necesita crear una nueva versión". Si no. Prefiero eliminar el existente en el dispositivo cada vez (durante el desarrollo inicial). De esta forma, no tengo que pensar si el cambio que acabo de hacer es lo suficientemente liviano. De esta manera, tengo un flujo de trabajo que siempre funciona. –

Cuestiones relacionadas