2016-12-09 4 views
2

Ich bin neu in Core Data, und ich führe derzeit eine Anwendung mit Core Data.Kerndaten - Leichte Migration funktioniert nicht

In der Notwendigkeit, eine neue Version der Anwendung bald zu veröffentlichen, muss ich en Entity zum Datenmodell hinzufügen.

Ich habe dieses Tutorial Lightweight tutorial gefolgt, das sehr nützlich war, aber ich habe auch die ganze Apple Dokumentation aber auch diesen erstaunlichen Artikel Core Data Migration gelesen, um globaly zu verstehen, wie es funktioniert.

Obwohl ich dem Datenmodell nur eine Entität hinzufügen musste, habe ich gehört, dass eine Lightweight-Migration in dieser Situation in Ordnung war.

Es ist nur 1 neue Entity (ohne Attribute), die ich mit der bereits bestehenden Eltern Entity verknüpfen muss.

Was ich bisher getan haben:

  • Die Anwendung ist derzeit auf der Version 3 des Datenmodells
  • ich ein neues Datenmodell erstellt haben (Version 4) von der Version 3
  • I habe das Datenmodell Version 4 als aktuelles Datenmodell ausgewählt
  • Ich habe meine neue Entity (ohne Attribut) erstellt und mit der übergeordneten Entity verknüpft.
  • Ich habe das generierte Klassenobjekt erstellt
  • Dann modifiziert ich meine UI

erstellen und ausführen, funktioniert es, cool. ABER wenn ich die aktuelle Version vom AppStore herunterlade, und wenn ich das neue, kürzlich erstellte Archiv/IPA von TestFlight installiere, (installiere über das alte -> Migrationsszenario), starte die Anwendung ohne mein neues Entity/Datamodel.

Aus der Apple-Dokumentation geht hervor, dass das Hinzufügen von Entität von Core Dara für Lightweight Migration unterstützt wird.

Ich weiß, das ist kein einfacher Prozess, aber ich fühle mich wie ich alles perfekt verfolgt habe.

Wie kann ich ohne jedes Zeitarchiv die Migration testen, veröffentliche auf Testflug etc ...

Wenn Sie weitere Informationen benötigen, um zu verstehen, klar mein Problem und/oder eine aufwendigere Antwort schreiben, fühlen sich frei, im Kommentar zu fragen und ich werde meine Frage bearbeiten.

Vielen Dank im Voraus.

EDIT:

Hier sind der Code über den NSPersistentStoreCoordinator vom AppDelegate.

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. 
    if (_persistentStoreCoordinator != nil) { 
     return _persistentStoreCoordinator; 
    } 

    // Create the coordinator and store 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    NSURL *storeURL = [self persistentStoreURL]; 
    NSError *error = nil; 
    NSString *failureReason = @"There was an error creating or loading the application's saved data."; 
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} error:&error]) { 
     // Report any error we got. 
     NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
     dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data"; 
     dict[NSLocalizedFailureReasonErrorKey] = failureReason; 
     dict[NSUnderlyingErrorKey] = error; 
     error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict]; 
     // Replace this with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     DDLogError(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return _persistentStoreCoordinator; 
} 

Ich weiß nicht, wie kann ich durch Tests oder Protokolle effektiv weiß, dass Coredata das neue Datenmodell (Version 4) verwendet und hat die Migration erfolgreich durchgeführt.

Ich weiß, es funktioniert, wenn ich von xCode erstellen, aber es ist nicht die gleiche Situation als ein Update aus dem AppStore.

Antwort

2

Um eine App für eine Lightweight-Migration einzurichten, müssen Sie die folgenden Zeilen in Ihr CoreData-Framework einfügen, in dem der Persistent Store deklariert ist. Diese Einstellungen die Optionen aktivieren, die leichte Migrationen unterstützen (diese von einem Swift 3.0 App sind, so dass sie ein wenig variieren können, wenn Sie in 2.3 sind):

NSMigratePersistentStoresAutomaticallyOption as NSObject: true     
NSInferMappingModelAutomaticallyOption as NSObject: true 

Sobald diese Zeilen vorhanden sind, wird Coredata leichte Wanderungen durchführen Wann immer sie benötigt werden, einschließlich des Hinzufügens neuer Entitäten, Attribute und Beziehungen, sollten Sie in Ordnung sein, solange Sie nichts tun, was Ihrerseits mehr Aktionen erfordert - wie den Namen einer Entität oder Eigenschaft zu ändern.

+0

Ich habe meine Frage bearbeitet. – Balanced

+0

Die Optionen werden bereits in der Anwendung verwendet. Die App funktioniert perfekt mit meiner neuen Funktion und dem neuen Datamodell. Bei der Installation über eine Anwendung mit dem vorherigen Datenmodell wird die Migration jedoch nicht ausgeführt. – Balanced

+0

Versuchen Sie, der neuen Entität ein Attribut hinzuzufügen. Wenn bei der Migration ein Problem auftritt, erhalten Sie eine Fehlermeldung, und die App wird nicht ausgeführt, also nicht. Ich glaube, es löst die Migration nicht aus, da die Entität in gewisser Hinsicht "leer" erscheint. –