Mon application est actuellement dans l'App Store et je la mets à jour avec un seul Attribut ajouté au modèle de données. J'ai ajouté une version du modèle et le mettre à jour.Problème de migration léger Core Data
Tout fonctionne mais lorsque j'essaie d'installer une nouvelle version de l'application sur une ancienne version contenant des données, l'application ne parvient pas à charger sans messages d'erreur. Il continuera à échouer (clignotant brièvement à l'écran) jusqu'à ce que je redémarre l'appareil ou que j'installe à nouveau l'application mise à jour via XCode ou iTunes, l'application fonctionne correctement et les données migrent correctement. Je crains que si cela arrive aux clients, ils vont supprimer l'application avant de réinstaller et de perdre toutes leurs données. Quelqu'un at-il une idée? Toute aide est appréciée
Merci, J'utilise le code suivant dans le délégué App pour la migration des données:
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
NSString *path = [[NSBundle mainBundle] pathForResource:@"DataStore" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
return managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DataStore.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"DataStore" ofType:@"sqlite"];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}
}
NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],
NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES],
NSInferMappingModelAutomaticallyOption, nil];
NSError *error;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
return persistentStoreCoordinator;
}
Merci pour votre réponse, j'ai regardé à nouveau les modèles de données et il semble correct. Je suis également retourné à ma version précédente et suis passé par le processus d'ajout d'une nouvelle version de données avec les mêmes résultats. –
Avez-vous des suggestions sur les raisons pour lesquelles cela ne fonctionnerait pas la première fois, mais ensuite vous travaillerez bien avec une migration réussie la deuxième fois? Il doit y avoir quelque chose que je peux faire pour m'assurer que cela fonctionne la première fois, peut-être que le modèle de données original n'est pas lu correctement ou quelque chose? –
Certes, il est conçu pour fonctionner la première fois. J'ai utilisé ce type de migration avec succès sans problème dans l'application que je construis. Est-il possible que l'attribut nouvellement créé ne soit pas initialisé correctement lors de la migration? c'est-à-dire que vous attendez une valeur qui est configurée sur insert au lieu de fetch? Avez-vous apparié votre application afin qu'elle ne fasse rien d'autre que tenter la migration et afficher un simple contrôleur de vue? On dirait que quelque chose accède aux données après que la migration est à l'origine du plantage. – DigitalBytes