J'ai ajouté tout le code pertinent au délégué d'application, et je peux ajouter au modèle de données et extraire du modèle de données dans applicationDidFinishLaunchingWithOptions.
Mon problème survient lorsque j'essaie d'écrire dans le modèle de données de mon View Controller. J'ai ajouté ce code au fichier d'en-tête:
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
Et ce code dans mon fichier d'implémentation:
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]);
}
Cependant, j'obtiens l'erreur suivante:
'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Events''
Est-ce que quelqu'un sait ce qui se passe? Toute aide serait appréciée.
Si vous utilisez des séquences, vous obtiendrez les mêmes problèmes si vous ne passez pas le contexte sur toute la ligne. Utilisez ce code dans la méthode prepareForSegue de la classe initiant la séquence:
[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
Cela suppose que vous tenez votre contexte dans une propriété appelée "managedObjectContext" bien sûr.
J'avais oublié de transmettre le contexte au contrôleur de vue. Erreur de débutant.
Vous pouvez passer le contexte en incluant le code suivant avant de commencer à extraire les données de la base de données:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];
vous devez l'ajouter à votre viewController:
id delegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = [delegate managedObjectContext];
Dans mon cas, le .xcdatamodeld
a été mal étiqueté dans l'AppDelegate:
let container = NSPersistentContainer(name: "name of data model")
J'ai eu ce problème et un collègue m'a aidé. Si vous obtenez ce message d'erreur: "entityForName: nil n'est pas un paramètre NSManagedObjectContext légal recherchant le nom d'entité". Et vous avez apporté des modifications à votre modèle de coredata. Je pense que le problème peut-être pas le code.
La solution peut être simple. Essayez l'une de ces options:
J'espère que ça aide.
Je suis fan de l'initialisation paresseuse. De cette façon, si vous devez injecter un nouveau contexte pour les tests, vous pouvez, ou il obtiendra son contexte du délégué de l'application si vous y configurez votre MOC.
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;
}
Si le contrôleur de vue de destination est intégré dans un NavigationController, le contexte doit être défini de manière appropriée comme suit:
self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0];
[self.mydetailViewController setManagedObjectContext:self.managedObjectContext];