2016-03-21 7 views
0

Ich arbeite an einer Anwendung, in der wir x.x.xcdatamodel verwenden. Jetzt habe ich in demselben x.x.xcdatamodel ein Attribut in einer der Entitäten hinzugefügt. Die Anwendung stürzt ab und zeigt die Meldung "Dieser NSPersistentStoreCoordinator hat keine persistenten Speicher (Schemabekenntnis oder Migrationsfehler). Es kann keine Speicheroperation ausgeführt werden.". Ich habe versucht, viele Dinge, und ich bin auch mit leichter Migration, die Situation zu handhaben, aber das funktioniert nicht wie well.Below mein Code:Dieser NSPersistentStoreCoordinator hat keine persistenten Speicher (Schemafisammenpass oder Migrationsfehler). Es kann keine Sicherungsoperation ausführen

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (__persistentStoreCoordinator != nil) 
    { 
     return __persistentStoreCoordinator; 
    } 

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"myApp.sqlite"]; 

    NSError *error = nil; 
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

    NSDictionary *options = @{ 
           NSMigratePersistentStoresAutomaticallyOption : @YES, 
           NSInferMappingModelAutomaticallyOption : @YES, 
           NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"} 
           }; 

    if(![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
    { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    } 

    return __persistentStoreCoordinator; 
} 




- (BOOL) saveContext 
{ 
    @synchronized (_localStorage) { 
     //NSLog(@"----------------------------Save context called---------------------------"); 
     BOOL result = TRUE; 
     NSError *error = nil; 
     NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 

     if (managedObjectContext != nil) 
     { 
      //Crashes here at this line. 
      if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) 
      { 
       NSLog(@"----------------------------Save context failed---------------------------"); 
       result = FALSE; 
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      } 
     } 

     //NSLog(@"----------------------------Save context completed---------------------------"); 

     return result; 
    } 
} 

Bin ich etwas hier fehle? ODER Ist es so, als ob ich eine vollständige Migration durchführen müsste, auch wenn ich ein einzelnes Attribut in einer Entität anlege? Vielen Dank im Voraus.

Antwort

5

Sie müssen die Migration nicht selbst durchführen. Sie do müssen eine neue Version des Datenmodells hinzufügen. Sie können die xcdatamodel nicht bearbeiten und erwarten, dass Core Data nur die neue Version verwendet. Sie müssen Ihr vorhandenes Modell beibehalten, eine neue Version erstellen und Ihre Änderungen in der neuen Version in der neuen Version vornehmen. Sie müssen immer eine Version des Modells haben, die der Datei für den persistenten Speicher entspricht.

Sie erstellen eine neue Version von der xcdatamodel Modelldatei in Xcode Datei Browser-Software, zum „Editor“ Menü gehen, und wählen Sie „Add Modell Version ...“

+0

Also, wenn ich ein neues Attribut hinzufügen möchten an die Entität und möchten das Update in den Laden hochladen, müssen Sie ein neues Datenmodell erstellen? auch nur für eine kleine Veränderung? –

+0

Ja, jedes Mal, wenn Sie das Datenmodell ändern. Normalerweise haben Datenmodelle keine häufigen Änderungen, wenn sie sorgfältig geplant werden. –

+0

Ok vielen Dank für Ihre Hilfe, hoffentlich durch Hinzufügen einer neuen Version wird dieses Problem gelöst, Problem ist, dass wir es nicht zu meinem Ende reproduzieren können, aber die App stürzt für die Benutzer, so ist es ein bisschen schwierig für mich, sicher zu sein . –