1

J'utilise Core Data + sqlite comme cache de données. L'application lit dans un fichier les données de base, puis utilise les données de base pour exécuter l'application. Les sauvegardes sont effectuées à la fois sur NSManagedObjectContext et sur le fichier. J'ai cependant remarqué que si je quittais l'application et la rechargeais sans repeupler la base de données Core Data, certaines (mais pas toutes) les données enregistrées avec -save: ne sont pas enregistrées dans le magasin de données.L'enregistrement d'une instance d'un NSManagedObjectContext ne sauvegarde pas de façon permanente un attribut transformable mutable

Les modifications apportées à mon objet géré sont toutes effectuées dans un seul lot sur le thread principal, le message -save: étant envoyé une fois toutes les modifications effectuées. Les données qui ne sont pas enregistrées sont un attribut transformable, le seul attribut transformable de l'objet de données principal. Voici le code qui enregistre l'objet:

NSInteger columnIndex = [headers indexOfObject:questionID]; 
    if (NSNotFound != columnIndex) { 

        // parsedLine is a mutable array already 
     NSMutableArray *parsedLine = person.dataFromFile.parsedLine; 
     [parsedLine replaceObjectAtIndex:columnIndex withObject:answer]; 
     person.dataFromFile.parsedLine = parsedLine; 

     person.questionsAnsweredByPerson = [NSNumber numberWithInt:[FileParser questionsAnsweredInRow:person.dataFromFile.parsedLine withRowHeaders:headers]]; 

     person.address.street.questionsAnsweredByPeopleOnStreet = [NSNumber numberWithInt:[self questionsAnsweredByPeopleOnStreet]]; 

     //NSLog(@"rawLineBefore:\n%@", person.dataFromFile.rawLine); 
     person.dataFromFile.rawLine = [ReconstructCSV composeCSVLineFromArray:person.dataFromFile.parsedLine]; 
     //NSLog(@"rawLineAfter:\n%@", person.dataFromFile.rawLine); 


     Voter_SurveyAppDelegate *appDelegate = (Voter_SurveyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

     NSError *error; 

     NSManagedObjectContext *managedObjectContext = [appDelegate managedObjectContext]; 
     if (![managedObjectContext save:&error]) { 
      // XXX inform the user there was a fatal error opening the file. Low disk space? 
      NSLog(@"Unresolved error - could not save managedObjectContext - %@, %@", error, [error userInfo]); 
      abort(); 
     } 
     return YES; 
    } 

abort(); ne s'appelle pas, donc je suppose -save; est appelé correctement.

Je doute qu'il soit lié, mais après que ce code est exécuté sur le thread principal, j'effectue une demande NSFetchRequest en utilisant un nouveau NSManagedObjectContext sur un thread différent. Rien d'autre ne se produit lié aux données de base sur d'autres threads. Pourquoi l'attribut transformable n'est-il pas sauvegardé?

Pourquoi l'attribut transformable n'est-il pas sauvegardé?

Répondre

1

Le problème est que les propriétés transformables n'aiment pas les objets Mutable. Comme indiqué dans une réponse à this question, un NSMutableDictionary n'a pas été enregistré. Dans mon cas, c'était un NSMutableArray.

Questions connexes