2010-04-16 2 views
0

Ma question est similaire à this one.Erreurs de données de base contre les exceptions Partie 3

Contexte

Je crée un grand nombre d'objets dans un magasin de données de base en utilisant NSOperations pour accélérer les choses. J'ai suivi toutes les règles de multithreading Core Data - J'ai un seul coordinateur de stockage persistant et un contexte d'objet géré par thread qui, lors de la sauvegarde, est en train de revenir au contexte de l'objet géré principal.

Le problème

Lorsque le nombre de threads en cours d'exécution à la fois est plus de 1, je reçois l'exception connecté sauvegarde de mon magasin de données de base:

NSExceptionHandler has recorded the following exception: 
NSInternalInconsistencyException -- optimistic locking failure 

Ce que j'ai

Mon code qui crée de nouvelles entités est assez complexe - il rend les entités qui ont des relations avec d'autres entités qui pourraient être créées dans une séparation te fil.

Si je remplace ma routine de création d'objets par un code très simple ne faisant que des entrées non liées, tout fonctionne parfaitement. Au début, à l'exception des exceptions, j'obtenais une erreur d'enregistrement indiquant que les données de base ne pouvaient pas être sauvegardées en raison de l'échec de la fusion. J'ai lu les documents et réalisé que j'avais besoin d'une politique de fusion sur le contexte d'objet géré que je sauvegardais. Je l'ai mis en place et comme this question états, l'erreur d'enregistrement disparaît, mais l'exception reste.

Ma question

Ai-je besoin de vous soucier de ces exceptions? Si je dois me débarrasser des exceptions, des idées sur la façon dont je le fais?

Répondre

1

Vous devez capturer cette exception, puis imprimer toutes les informations qui lui sont associées pour déterminer la cause exacte. Les exceptions sont assez rares dans les données de base et ne devraient jamais être ignorées.

Cependant, vous ne nous avez pas fourni suffisamment d'informations pour vous aider à le retrouver. La première étape consiste donc à dérouler cette exception et à voir ce qui se passe.

1

Les exceptions dans Cocoa sont un signe que quelque chose de vraiment méchant est arrivé et qu'il est préférable de quitter le plus tôt possible. En général, Cocoa utilise des valeurs de retour et des paramètres d'entrée pour communiquer les conditions d'erreur.

Créez-vous un nouveau NSManagedObjectContext pour le nouveau fil de discussion? Le document Apple Multi-Threading with Core Data donne des instructions pour le multithreading avec les données de base. Il recommande:

Créer un objet contexte géré distinct pour chaque fil et de partager un coordonnateur de magasin persistant unique .

+0

Merci pour votre commentaire Benedict.J'ai mis à jour ma question avec plus de détails. J'ai étudié les directives de multithreading de données de base très soigneusement et j'ai passé beaucoup de temps à m'assurer que, avec un algorithme de création d'entité simple, les NSOperations fonctionnent parfaitement. Je me demande si la solution est d'aller à propos de ma création d'objet d'une manière différente ... –

Questions connexes