2009-08-12 8 views
6

Je développe une application dans le cacao. Je suis confronté à un problème critique."Les données de base ne peuvent pas remplir une erreur .." erreur

je supprime les entrées d'un objet nommé « Répertoire » dans les données de base en utilisant le code suivant:

NSEnumerator *tempDirectories = [[folderArrayController arrangedObjects] objectEnumerator]; 
id tempDirectory; 
while (tempDirectory = [tempDirectories nextObject]){ 
    [managedObjectContext deleteObject:tempDirectory]; 
} 

Mais parfois une exception comme « Core Data ne pouvait pas répondre à une faute .. » se produit tout en essayant de enregistrer après la suppression. J'utilise le code [managedObjectContext save];

Je suis nouveau dans les données de base ... Dans l'attente d'une solution.

+1

Regardez le troisième paragraphe ici: [Défaut ne peut pas être rempli] (http://developer.apple.com/documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html#//apple_ref/doc/uid/TP40002320- SW7) –

+0

Mais comment déboguer et savoir quel est le module exact à l'origine de cette exception? –

Répondre

4

Ceci est une vieille question, j'ai lutté résoudre ce problème depuis un certain temps maintenant. Donc, pensé qu'il serait préférable de le documenter.

Comme Weichsel mentionné ci-dessus, the Apple documentation souligne à juste titre la raison de cette exception. Mais c'est un travail trépidant d'identifier le module à cause duquel l'objet de la sous-classe NSManagedObject est retenu (si la première raison citée dans la documentation est la cause profonde du problème). Par conséquent, j'ai commencé par identifier les parties de mon code qui conservaient NSManagedObject, mais j'ai conservé l'objet NSManagedObjectID et j'en ai créé l'objet géré chaque fois que cela était nécessaire. La discussion en ligne similaires peuvent être trouvées dans la documentation Restkit:

  1. https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39
  2. https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605

mis à jour mon setter et getter pour que l'interface avec le reste des modules restent même en interne, nous dépendons maintenant sur NSManagedObjectID et éviter de conserver NSManageObject:

-(CSTaskAbstract*)task 
{ 
    CSTaskAbstract *theTask = nil; 
    if (self.taskObjectID) 
    { 
     NSManagedObjectContext *moc = [(CSAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
     // https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39 & 
     // https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605 
     NSError *theError = nil; 
     NSManagedObject *theObject = [moc existingObjectWithID:self.taskObjectID 
                 error:&theError]; 
     if ([theObject isKindOfClass:[CSTaskAbstract class]]) 
     { 
      theTask = (CSTaskAbstract*)theObject; 
     } 
    } 
    return theTask; 
} 
-(void)setTask:(CSTaskAbstract *)inTask 
{ 
    if (inTask!=self.task) 
    { 
     // Consequences of retaining a MO when it is detached from its MOC 
     [self setTaskObjectID:[inTask objectID]]; 
    } 
} 

Ce qui précède est le premier hal f du problème résolu. Nous devons trouver la dépendance dans les parties suspectes de notre application et éliminer. Il y avait un autre problème aussi, instruments -> allocations est une bonne source pour trouver quels modules sont en train de conserver les objets gérés, l'objet exception aurait des détails sur quel objet géré crée le problème, filtre les résultats pour cela objet comme indiqué ci-dessous:

Instruments - Allocations

Nous jouions KVO sur un objet géré. KVO conserve l'objet géré observé et, par conséquent, l'exception est levée et sa trace arrière ne proviendrait pas de notre projet. Ils sont très difficiles à déboguer, mais devinez le travail et le suivi du cycle d'allocation et de rétention-libération de l'objet vous aidera sûrement. J'ai enlevé la partie d'observation du KVO et tout a commencé à fonctionner.

+0

+1 pour le lien du document Apple – Martin

Questions connexes