2010-11-17 3 views
3

J'ai une base de données de plusieurs à plusieurs relation d'article à catégorie. Lorsque j'essaie d'enregistrer, j'obtiens l'erreur suivante. Je suis incapable de trouver des informations sur ce que cela signifie, et pourquoi il existe deux versions lorsque la base de données est vide. Quelqu'un peut-il nous éclairer?iOS: erreur de données de base: NSMergeConflict pour NSManagedObject

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 (NSString *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]; 

Répondre

4

L'erreur de votre obtenir est pas réellement lié aux données lui-même, mais plutôt fait en ayant deux versions inconciliables de l'écriture de modèle de données au même magasin persistant fichier.

Vous devez avoir créé un modèle de données, l'avoir utilisé pour écrire des données dans le magasin permanent, puis le mettre à jour. Ce n'est normalement pas un problème, sauf si vous modifiez le modèle de données de telle sorte que la migration automatique ne peut pas fusionner les anciennes et les nouvelles données. 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 reconstruire et l'exécuter à l'aide du dernier modèle de données. Cela ne nécessitera aucune migration et passera donc l'erreur de fusion.

+0

Merci pour votre aide. J'ajoutais des données à sqlite puis j'ajoutais le sqlite au projet. Cela a semblé causer un certain type de problème de version. J'ai ajouté toutes les données nécessaires dans le code, j'ai sorti le DB du simulateur, je l'ai ajouté au projet et le problème a disparu. –

+0

Il est très difficile d'ajouter des données directement dans un magasin SQL Core Data car il utilise son propre schéma non documenté. – TechZen

Questions connexes