2016-12-09 1 views
2

Je suis nouveau dans Core Data, et je suis en train de gérer une application utilisant des données de base.Données de base - La migration légère ne fonctionne pas

Dans le besoin de publier une nouvelle version de l'application bientôt, je dois ajouter Entité au modèle de données.

J'ai suivi ce tutoriel Lightweight tutorial qui était très utile mais aussi j'ai lu toute la documentation d'Apple mais aussi cet incroyable article Core Data Migration afin de comprendre globalement comment cela fonctionne.

Bien que je devais ajouter une seule entité au modèle de données, j'ai entendu qu'une migration légère était OK dans cette situation.

C'est seulement 1 nouvelle entité (sans attributs) que je dois lier à l'entité parente déjà existante.

Ce que je l'ai fait jusqu'à présent:

  • L'application est actuellement sur la version 3 du modèle de données
  • J'ai créé un nouveau modèle de données (version 4) de la version 3
  • I J'ai choisi le modèle de données version 4 comme modèle de données actuel
  • J'ai créé ma nouvelle entité (sans attribut) et je l'ai liée à l'entité parente.
  • J'ai créé l'objet de classe générée
  • Je modifié mon interface

créer et exécuter, cela fonctionne, cool. MAIS quand je télécharge la version actuelle de l'AppStore, et quand j'installe la nouvelle Archive/IPA de TestFlight, (installation sur l'ancien -> scénario de migration), l'Application fonctionne sans ma nouvelle Entité/Datamodel. Dans la documentation Apple, il est très clair que l'ajout d'Entity est pris en charge par Core Dara pour la migration légère.

Je sais que ce n'est pas un processus facile, mais j'ai l'impression d'avoir tout suivi parfaitement.

Comment puis-je tester la migration sans chaque archive de temps, publier sur TestFlight etc ...

Si vous avez besoin de informations supplémentaires afin de bien comprendre ma question et/ou écrire une réponse plus élaborée, ne hésitez pas demander dans le commentaire et je vais éditer ma question.

Merci d'avance.

EDIT:

Voici le code de la NSPersistentStoreCoordinator du 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; 
} 

Je ne sais pas comment je sais efficacement par des tests ou les journaux qui CoreData utilisent les nouvelles données modèle (version 4) et a effectué avec succès la migration. Je sais que ça marche quand je compile à partir de xCode mais ce n'est pas la même situation qu'une mise à jour depuis l'AppStore.

Répondre

2

Pour configurer une application pour une migration légère, vous devez insérer les lignes suivantes dans votre infrastructure CoreData où la banque persistante est déclarée. Ces paramètres permettent aux options qui prennent en charge les migrations légères (celles-ci sont d'une application 3.0 Swift afin qu'ils peuvent varier un peu si vous êtes en 2.3):

NSMigratePersistentStoresAutomaticallyOption as NSObject: true     
NSInferMappingModelAutomaticallyOption as NSObject: true 

Une fois ces lignes sont en place, CoreData effectuera des migrations légères correctement chaque fois que cela est nécessaire, y compris l'ajout de nouvelles entités, attributs et relations, vous devriez donc être OK tant que vous ne faites rien qui nécessite plus d'action de votre part - comme changer le nom d'une entité ou d'une propriété.

+0

J'ai modifié ma question. – Balanced

+0

Les options sont déjà utilisées dans l'application. L'application fonctionne parfaitement avec ma nouvelle fonctionnalité et le nouveau datamodel. Mais lors de l'installation sur une application avec le datamodel précédent, elle ne gère pas la migration. – Balanced

+0

Essayez d'ajouter un attribut à la nouvelle entité. Si un problème survient lors de la migration, un message d'erreur s'affiche et l'application ne s'exécute pas, ce qui n'est pas le cas. Je pense que cela ne déclenche tout simplement pas la migration puisque l'entité apparaît "vide" dans un certain sens. –