2010-12-09 6 views
5

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; 
} 

Répondre

1

Etes-vous sûr que vous avez fait aucun changement à la version précédente de votre modèle? Ce comportement semble que les données de base ne peuvent pas trouver de modèle pour le magasin persistant que vous avez sur le périphérique.

Vous devriez être en mesure de voir toutes les erreurs de données de base dans le journal de la console lorsque vous démarrez l'application qui contient une ancienne version de votre magasin persistant.

À quel point avez-vous ajouté votre nouvel attribut? Si vous l'avez ajouté avant de créer la nouvelle version, l'ancienne et la nouvelle version auront l'attribut. Vérifiez votre ancien modèle et assurez-vous que le nouvel attribut n'est pas là.

+0

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. –

+0

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? –

+0

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

1

J'ai également rencontré ce problème. Le projet par défaut généré à partir des données de base n'a pas coupé, même pour les migrations simples mais cet article par Jeff LaMarche m'a aidé à faire avancer les choses de travail:

http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html

Tout ce que je devais faire était la version du modèle, faire ces changements , et changez le code et cela a fonctionné. J'espère que cela pourra aider!

+0

Merci, je me suis référé à cet article quand je mettais la migration ensemble et ça m'a aidé. Pour être clair, la migration fonctionne, mais pour une raison quelconque, je dois installer l'application deux fois pour qu'elle soit réellement lancée. –

0

N'oubliez pas que vous avez également besoin des schémas source et de destination disponibles dans votre application pour que la migration fonctionne.

+0

Merci, oui, ils sont tous les deux là. Encore une fois, la migration fonctionne, avec le nouvel attribut disponible, mais je dois installer l'application deux fois ou réinitialiser l'appareil pour que l'application puisse être lancée. –

Questions connexes