2012-07-21 8 views
71

Ho aggiunto tutto il codice pertinente al delegato dell'app e sono in grado di aggiungere al modello dati e recuperare dal modello dati in applicationDidFinishLaunchingWithOptions.'+ entityForName: nil non è un parametro NSManagedObjectContext legale - Dati principali

Il mio problema si presenta quando sto provando a scrivere sul modello di dati nel mio View Controller. Ho aggiunto questo codice al file di intestazione:

NSFetchedResultsController *fetchedResultsController; 
NSManagedObjectContext *managedObjectContext; 

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController; 
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 

E questo codice nel mio file di implementazione:

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]); 
} 

Tuttavia, ottengo il seguente errore:

'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Events'' 

Qualcuno sa cosa sta succedendo? Qualsiasi aiuto sarebbe apprezzato.

+12

Penso che il contesto sia zero. Assicurati che [self managedObjectContext] non stia tornando nil – mask8

+1

Notando per la posterità, puoi ottenere questo errore se passi il ivar per ManagedObjectContext invece di usare il metodo getter – Matthematics

risposta

36

Se si utilizza segues si otterrà gli stessi problemi se non si passa il contesto lungo la linea. Utilizzare questo codice nel metodo prepareForSegue della classe di iniziare la segue:

[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext]; 

Questo presuppone si tiene il contesto in una proprietà chiamata "managedObjectContext", naturalmente.

+1

L'ho impostato su _managedObjectContext e si blocca. self.mangeObjectContext risolverlo. Grazie! –

+0

Felice che funzioni! Credo che, inserisci Xcode 4.4, se usi semplicemente "@synthesize myProperty;" il compilatore crea una variabile di istanza denominata "myProperty" anziché "_myProperty". Se non si utilizza "@synthesize", si ottiene "_myProperty". Quindi "_managedObjectContext" potrebbe non esistere. Non lo so perché non riesco a vedere il tuo codice. "self.managedObjectContext" è sicuro perché chiama l'accessor come sempre. – Tim

46

Avevo dimenticato di passare il contesto al controller di visualizzazione. Errore Rookie.

+0

e questo è il modo per passare il contesto al controller della vista: AppDelegate * appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; contesto = [appDelegate managedObjectContext]; –

45

È possibile passare il contesto includendo il seguente codice prima di iniziare a recuperare i dati del modulo del database:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate]; 
context = [appDelegate managedObjectContext]; 
+0

Grazie per questo piccolo frammento .. Non riesco mai a ricordare la sintassi completa! – RyanG

20

si dovrebbe aggiungere questo alla tua viewController:

id delegate = [[UIApplication sharedApplication] delegate]; 
    self.managedObjectContext = [delegate managedObjectContext]; 
0

Se il controller della vista di destinazione è incorporato in un navigationController, il contesto deve essere impostato in modo appropriato i seguenti-

self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0]; 
[self.mydetailViewController setManagedObjectContext:self.managedObjectContext]; 
2

ho ottenuto questo problema e un collega mi ha aiutato. Se hai ricevuto questo messaggio di errore: "entityForName: nil non è un parametro NSManagedObjectContext legale che cerca il nome dell'entità". E hai apportato delle modifiche al tuo modello di coredata. Penso che il problema potrebbe non essere il codice.

La soluzione può essere semplice. Prova una di queste opzioni:

  • Basta eliminare l'app dal dispositivo che stai testando, dovrebbe avere la vecchia versione del tuo modello.
  • Creare un'altra versione di database utilizzando Xcode,> Editor> Aggiungi versione modello.

Spero che sia d'aiuto.

1

Nel mio caso il .xcdatamodeld è stato erroneamente nel AppDelegate:

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

io sono un fan di inizializzazione pigra. In questo modo se hai bisogno di iniettare un nuovo contesto per i test che puoi, o otterrà il suo contesto dal delegato dell'app se hai configurato il tuo MOC lì.

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; 
    } 
Problemi correlati