2012-10-13 124 views
5

Estoy trabajando con Core Data y tratando de que muestre datos con un modelo de datos simple. La aplicación se bloquea y me da este mensaje de errorDatos básicos que dan error

Terminación de aplicación debido a excepción no detectada 'NSInvalidArgumentException', razón: '+ entityForName: cero no es un parámetro NSManagedObjectContext legal búsqueda de nombre de la entidad 'Recuerde a''

No estoy del todo seguro, pero ¿cómo lo tomo es que está diciendo que no puede encontrar mi entidad llamada Remind? Sin embargo, de hecho tengo una entidad llamada Remind.

También puse los puntos de interrupción y se detiene aquí: enter image description here

Cualquier ayuda sería muy apreciada. Completamente en un callejón sin salida.

Gestionado código Contexto de Aplicación Delegado .m

enter image description here

+0

El contexto de su objeto gestionado es nulo. Supongo que es un ivar ... No se ha establecido en nada. –

+0

Gracias por su respuesta. ¿Puede decirme cómo podría solucionar este problema? – Zack

+0

Desafortunadamente no, o lo hubiera puesto en una respuesta. Necesita agregar más código, no hay suficiente información aquí. ¿En qué punto de su controlador de vista está configurando ManageObjectContext ivar? –

Respuesta

1

El problema aquí es que el descriptor de acceso y su Ivar tienen el mismo nombre. Ahí es donde viene la convención de ivar underbar. Aquí, no está usando el acceso para acceder a su propiedad, está usando la variable de respaldo directamente, por lo que nunca se inicializa. En su lugar, asegúrese de revisar siempre sus métodos de acceso y no tendrá problemas. Así, reescribir el método infractor (y cualquier otro que utilice la propiedad managedContextObject con algo como lo siguiente:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; // it's good practice to call the super methods, even if you're fairly certain they do nothing 

    // Get a reference to the managed object context *through* the accessor 
    NSManagedObjectContext* context = [self managedObjectContext]; 

    // From now on, we only use this reference in this method 
    NSFetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription* entity = [NSEntityDescription entityForName:@"Remind" inManagedObjectContext:context]; // <- use the local reference we got through the accessor 
    [request setEntity:entity]; 
    NSError* error = nil; 
    NSArray* array = [context executeFetchRequest:request error:&error]; 
    if(!array) { 
    // Do something with the error 
    NSLog(@"Error Fetching: %@", error); 
    } 
    [self setDesitnationsArray:[array mutableCopy]]; 
    [destinationsTableView reloadData]; 
} 

Es posible que desee cambiar sus ivars a algo que no se verán tentados a usar o que va a ser inmediatamente Es evidente que no ha revisado los accesos, como _managedObjectContext o incluso _privateContext o lo que sea que se le ocurrirá hasta que se acostumbre a acceder a las propiedades a través de los accesadores. Si no le gusta la sintaxis de Objective-C para acceder a las propiedades, podría usar la sintaxis de puntos, pero siempre debe recordar pasar por self, por ejemplo, self.managedObjectContext. No me gusta este método ya que las personas se olvidan de que no es un acceso directo a la propiedad y está usando los accesos, entonces piensan que está bien intercambiar la sintaxis de punto para un acceso directo, cuando no es (como en su caso).

+0

Gracias por su respuesta. Sin embargo, modifiqué el código anterior al siguiente como lo hizo y todavía me está dando el mismo error, lamentablemente. – Zack

+0

@zack, obténgalo de su delegado de la aplicación a continuación. Tu problema es que tu ivar es nulo, y eso es un error. En realidad, no tiene una referencia a un contexto de objeto gestionado en ese método. –

+0

@JasonCoco Tengo el mismo problema. el contexto es nulo en mi caso. ¿Podrías decirme cómo obtenerlo del delegado de la aplicación? –

Cuestiones relacionadas