2010-04-26 13 views
4

Par le passé, j'avais déjà implémenté la migration automatique de la version 1 de mon modèle de données vers la version 2. Maintenant, à l'aide du SDK 3.1.3, migration de la version 2 à la version 3 échoue avec l'erreur suivante: "l'opération n'a pas pu être terminée (erreur Cocoa 134110.)"Échec de la migration de données avec erreur: Échec d'enregistrement du nouveau magasin après la première phase de migration

erreur non résolue erreur domaine = NSCocoaErrorDomain code = 134110 UserInfo = 0x5363360, { NSUnderlyingError = erreur de domaine = NSCocoaErrorDomain Code = 256 UserInfo = 0x53622b0 "L'opération n'a pas pu être terminée. (Erreur cacao 256.)"; reason = "Impossible d'enregistrer le nouveau magasin après le premier passage de la migration."; }

J'ai essayé la migration automatique à l'aide NSMigratePersistentStoresAutomaticallyOption et NSInferMappingModelAutomaticallyOption ainsi que la migration en utilisant uniquement NSMigratePersistentStoresAutomaticallyOption, fournissant un modèle de cartographie de v2 à v3. Je vois l'erreur ci-dessus enregistrée, et aucun objet n'est disponible dans l'application. Cependant, si je quitte l'application et la rouvre, tout est en place et fonctionne.

La base de données des méthodes que je utilise sont les suivantes

- (NSManagedObjectModel *)managedObjectModel { 

    if (managedObjectModel != nil) { 
     return managedObjectModel; 
    } 



    NSString *path = [[NSBundle mainBundle] pathForResource:@"MYAPP" ofType:@"momd"]; 
    NSURL *momURL = [NSURL fileURLWithPath:path]; 
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 

    return managedObjectModel; 

} 
- (NSManagedObjectContext *) managedObjectContext { 

    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 


    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 
    return managedObjectContext; 
} 



- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 


    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MYAPP.sqlite"]]; 


    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
     // Handle error 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    } 


return persistentStoreCoordinator; 

} 

Dans le simulateur, je vois que cela génère un MYAPP ~ fichiers .sqlite et un fichier MYAPP.sqlite. J'ai essayé d'enlever le fichier MYAPP ~ .sqlite, mais

BOOL oldExists = [[NSFileManager defaultManager] fileExistsAtPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MYAPP~.sqlite"]]; 

renvoie toujours NON. Une idée? Est-ce que je fais quelque chose de mal? Merci d'avance.

+0

Avez-vous déjà résolu cela? Je vois maintenant exactement le même problème, erreur 134110, c'est-à-dire qu'au premier lancement, il ne se charge pas correctement et lors des lancements ultérieurs, il ne le fait que sur 3.1.3. Très mauvaise expérience utilisateur pour le client – coneybeare

Répondre

1

Je me suis heurté à cela aussi et après avoir lu autant de documents Apple et d'affichages sur le Web que je n'ai pu trouver, il n'y avait pas de réponse. Dans mon cas, la migration manuelle fonctionnait également mais quand je suis allé ouvrir un nouveau coordinateur, cela donnait la même erreur que vous aviez. J'ai finalement décidé de revenir à ma dernière version de travail du modèle de données et de faire une série de petits changements/versions et de voir où il a brisé les capacités d'auto-migration pour forer plus loin et il s'est avéré que non. Maintenant, je peux ajouter des entités, des attributs et des relations sans problème et ils migrent automatiquement. Avez-vous déjà supprimé une version intermédiaire du modèle de données?

+0

Non, je viens de passer de v2 à v3 de mon modèle de données. Dans le processus j'ai ajouté deux entités, enlevé une entité et ajouté quelques attributs et une relation à une entité. Votre suggestion d'arriver à mon modèle de données final v3 par incrémentale vaut la peine d'être essayée. Je vais essayer d'ajouter des choses une à la fois et voir si cela fonctionne. –

1

Pour ce que ça vaut, le paquet utilitaire de base de données comprend Magical enregistrement de ce hack:

[coordinator MR_addAutoMigratingSqliteStoreNamed:storeFileName]; 

//HACK: lame solution to fix automigration error "Migration failed after first pass" 
if ([[coordinator persistentStores] count] == 0) 
{ 
    [coordinator performSelector:@selector(MR_addAutoMigratingSqliteStoreNamed:) withObject:storeFileName afterDelay:0.5]; 
} 

Vous pouvez essayer quelque chose de similaire. Cependant, j'ai été incapable de trouver une explication de ce qu'est le problème, ou pourquoi simplement le réessayer fonctionnerait.