objective c - ''+ entityForName: nil no es un parámetro legal de NSManagedObjectContext-Core Data
objective-c ios (8)
He agregado todo el código relevante al Delegado de la aplicación, y puedo agregarlo al modelo de datos y obtenerlo del modelo de datos en applicationDidFinishLaunchingWithOptions.
Mi problema surge cuando intento escribir en el modelo de datos en mi View Controller. He agregado este código al archivo de encabezado:
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
Y este código para mi archivo de implementación:
NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *model = [NSEntityDescription
insertNewObjectForEntityForName:@"Events"
inManagedObjectContext:context];
[model setValue:@"Sample Event" forKey:@"eventName"];
NSError *error;
if (![context save:&error]) {
NSLog(@"Couldn''t save: %@", [error localizedDescription]);
}
Sin embargo, me sale el siguiente error:
''NSInvalidArgumentException'', reason: ''+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name ''Events''''
¿Alguien sabe lo que está pasando? Cualquier ayuda sería apreciada.
En mi caso, el .xcdatamodeld
fue mal etiquetado en el AppDelegate:
let container = NSPersistentContainer(name: "name of data model")
Olvidé pasar el contexto al controlador de vista. Error de novato
Puede pasar el contexto incluyendo el siguiente código antes de comenzar a buscar los datos de la base de datos:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];
Si el controlador de vista de destino está incrustado en un NavigationController, el contexto debe configurarse apropiadamente de la siguiente manera:
self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0];
[self.mydetailViewController setManagedObjectContext:self.managedObjectContext];
Si usa segues, obtendrá los mismos problemas si no pasa el contexto en la línea. Utilice este código en el método prepareForSegue de la clase que inicia el segue:
[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
Eso supone que tienes tu contexto en una propiedad llamada "managedObjectContext", por supuesto.
Soy un fan de la inicialización perezosa. De esta forma, si necesita inyectar un nuevo contexto para las pruebas, puede hacerlo, o obtendrá el contexto del delegado de la aplicación si configura su MOC allí.
class.h
@property (strong, nonatomic,getter=getManagedObjectContext) NSManagedObjectContext *managedObjectContext;
class.m
-(NSManagedObjectContext *)getManagedObjectContext {
if (_managedObjectContext) {
return _managedObjectContext;
}
_managedObjectContext = [[(AppDelegate *)[[UIApplication sharedApplication]delegate]sharedDataModel]managedObjectContext];
return _managedObjectContext;
}
Tengo este problema y un colega me ayudó. Si recibió este mensaje de error: "entityForName: nil no es un parámetro legal de NSManagedObjectContext que busca el nombre de la entidad". Y realizó cambios en su modelo de coredatos. Creo que el problema podría no ser el código .
La solución puede ser simple. Pruebe una de esas opciones:
- Simplemente elimine la aplicación del dispositivo que está probando, debería tener la versión anterior de su modelo.
- Cree otra versión de base de datos usando Xcode,> Editor> Agregar versión de modelo.
Espero eso ayude.
deberías agregar esto a tu viewController:
id delegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = [delegate managedObjectContext];