web-dev-qa-db-fra.com

'+ entityForName: nil n'est pas un paramètre légal NSManagedObjectContext - Core Data

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.

72
Alex Godbehere

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.

37
Tim

J'avais oublié de transmettre le contexte au contrôleur de vue. Erreur de débutant.

46
Alex Godbehere

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];
45
Vishwani

vous devez l'ajouter à votre viewController:

 id delegate = [[UIApplication sharedApplication] delegate];
    self.managedObjectContext = [delegate managedObjectContext];
20
Hashem Aboonajmi

Dans mon cas, le .xcdatamodeld a été mal étiqueté dans l'AppDelegate:

 let container = NSPersistentContainer(name: "name of data model")
2

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:

  • Supprimez simplement l'application de l'appareil que vous testez, elle devrait avoir l'ancienne version de votre modèle.
  • Créez une autre version de base de données en utilisant Xcode,> Editeur> Ajouter une version de modèle.

J'espère que ça aide.

2
rafaeljuzo

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;
    }
0
SpaceTrucker

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];
0
hackerinheels