2009-11-23 1 views
10

Ho impostato un'entità utilizzando l'editor di file Xcode .xcdatamodel. Ho creato un'entità chiamata Persona, aggiunto alcuni attributi, quindi generato un file .m per rappresentarlo. Tutto funziona beneinsertNewObjectForEntityForName:

Ora quando vado a scrivere una riga di codice come:

 
    Person * person = (Person*)[NSEntityDescription 
         insertNewObjectForEntityForName:@"Person" 
         inManagedObjectContext:managedObjectContext]; 

e ottengo:

terminazione app a causa di eccezione non identificata 'NSInternalInconsistencyException', la ragione: '+ entityForName: non poteva individuare un NSManagedObjectModel per nome dell'entità 'persona''

ho seguito l'esempio posizione esattamente, però, passo per passo credo, ma penso che must hanno perso una sorta di passaggio cruciale di "registrazione" in cui dico a Xcode che la mia entità Persona dovrebbe essere accessibile. Inoltre non avevo affatto un modo per "inizializzare" il managedObjectContext, l'esempio di posizione non sembra che o.

risposta

15

Il fatto che non sia stato impostato il MOC è quasi certamente il problema. In particolare, significa che probabilmente non stai caricando il tuo MOM (Managed Object Model) che definisce Person. Da qualche parte nel codice si dovrebbe avere qualcosa di simile:

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];  

E qualcosa di simile:

persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

E qualcosa di simile:

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
if (coordinator != nil) { 
    managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    [managedObjectContext setPersistentStoreCoordinator: coordinator]; 

sto semplicemente copiando le linee di AppDelegate del modello Core Data (ciò che ottieni se crei una nuova applicazione che utilizza i dati principali).

Se si dispone di tutto ciò, assicurarsi che il proprio xcdatamodel sia elencato nel passaggio Compile Sources del build. E ovviamente assicurati che Persona sia effettivamente il nome dell'entità nel tuo xcdatamodel. Il nome dell'entità non è lo stesso di Class, anche se spesso sono impostati per essere uguali.

3

è necessario l'init del Core Data

-(void)initCoreData{ 
     NSError *error; 
     //Path to sqlite file. 
     NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/Level4.sqlite"]; 
     NSURL *url = [NSURL fileURLWithPath:path]; 

     //init the model 
     NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 

     //Establish the persistent store coordinator 
     NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel]; 

     if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error]){ 

       NSLog(@"Error %@",[error localizedDescription]); 

     }else{ 
       self.context = [[[NSManagedObjectContext alloc ] init ] autorelease]; 
       [self.context setPersistentStoreCoordinator:persistentStoreCoordinator]; 
     } 

     [persistentStoreCoordinator release]; 
} 
2

Si dovrebbe verificare se l'oggetto NSManagedObjectContext è pari a zero.

ad es.

if (self.managedObjectContext == nil) { 
    NSLog(@"NSManagedObjectContext is nil"); 
    return nil; 
} 
+0

Questo mi ha aiutato a ricordare che non avevo passato il mio NSManagedObject alla vista successiva, motivo per cui stavo ottenendo l'errore sopra riportato. Grazie! – JasonBub