iOS: erreur de données de base: NSMergeConflict pour NSManagedObject

J'ai une database de plusieurs à plusieurs relation d'article à catégorie. Lorsque j'essaie d'save, j'obtiens l'erreur suivante. Je suis incapable de find des informations sur ce que cela signifie, et pourquoi il existe deux versions lorsque la database est vide. Quelqu'un peut-il nous éclairer?

Erreur: NSMergeConflict (0x76ae720) for NSManagedObject (0xd945560) with objectID '0xd943550 <x-coredata://09A438A8-E3F5-45FE-B9D7-106798E82E18/Article/p91>' with oldVersion = 1 and newVersion = 2

Code:

 NSMutableDictionary *dict = [[data objectAtIndex:i] valueForKey:@"category_names"]; NSMutableArray *values = [[NSMutableArray alloc] init]; for (NSSsortingng *value in [dict allValues]) { NSLog(@"value = %@", value); [values addObject:value]; } NSMutableSet *setElements = [[NSMutableSet alloc] init]; for (int i = 0; i < [values count]; i++) { Category *cat = [self getCategoryFor:[values objectAtIndex:i]]; // Function which has fetch to get the category for the value "name" [setElements addObject:cat]; } if ([setElements count] > 0) [article addCategories:setElements]; // Save the context. NSError* error; if (![managedObjectContext save:&error]) { NSLog(@"Failed to save to data store: %@", [error localizedDescription]); NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; if(detailedErrors != nil && [detailedErrors count] > 0) { for(NSError* detailedError in detailedErrors) { NSLog(@" DetailedError: %@", [detailedError userInfo]); } } else NSLog(@" %@", [error userInfo]); } [article release]; [values release]; [setElements release]; 

L'erreur que vous obtenez n'est pas réellement liée aux données elles-mêmes, mais plutôt parce que deux versions irréconciliables du model de données écrivent dans le même file de stockage persistant.

Vous devez avoir créé un model de données, l'avoir utilisé pour écrire des données dans le magasin persistant, puis mettre à jour le model. Ce n'est normalement pas un problème, sauf si vous modifiez le model de données de telle sorte que la migration automatique ne peut pas merge les anciennes et les nouveldatatables.

Si cela est encore en cours de développement et que vous n'avez pas besoin des données existantes, la solution la plus simple consiste à supprimer l'application du simulateur, puis à la générer et à l'exécuter à nouveau en utilisant uniquement le dernier model de données. Cela ne nécessitera aucune migration et passera donc l'erreur de fusion.