0

J'ai des problèmes avec un projet de données de base. J'ai un NSArrayController avec NSManagedObjects et des boutons +/-. Si je supprime un objet dans la ligne après que le fichier a été sauvegardé, il fonctionne parfaitement, mais si j'ajoute un nouvel objet et le supprime immédiatement (sans changer les valeurs par défaut), j'obtiens une erreur:Données de base: Erreur lors de la suppression d'un objet non enregistré

Serious application error. Exception was caught during Core Data change processing: Unknown number type or nil passed to arithmetic function expression. with userInfo (null) 
Unknown number type or nil passed to arithmetic function expression. 

C'est le même cas si j'annule l'ajout du nouvel objet.

Quelqu'un peut-il me donner un pointeur? Je suppose que cela a quelque chose à voir avec le fait qu'il a seulement une identification temporaire, mais comment le résoudre je ne sais pas.

Répondre

1

J'ai trouvé le problème et la solution. Pour le compte rendu, je vais le décrire.

Le problème était que l'objet dans sa fonction init ajoutait un observateur sur lui-même. C'est probablement ce qui a déclenché l'erreur. Si je supprime l'objet avant de supprimer l'objet en tant qu'observateur, l'erreur n'est pas produite.

+2

Vous ne devez pas ** ignorer ** la méthode '-init ...' d'un objet 'NSManagedObject' ni sa méthode '-dealloc' pour cela. Si vous avez besoin d'ajouter un observateur, vous devez le faire dans '-awakeFromInsert' et' -awakeFromFetch'. –

+0

Selon la documentation "Méthodes pour contourner les considérations" les deux initWithEntity: insertIntoManagedObjectContext: amd dealloc sont autorisés à être remplacés? La raison pour laquelle j'utilise init au lieu de awake, c'est parce que je trouve que awake n'est pas toujours callen (si un utilisateur annule ou quelque chose). Mais j'ai peut-être tort. –

+0

vous avez raison sur annuler et refaire, dans 10.6+ il y a la méthode supplémentaire awakeFromSnapshotEvent qui est également appelée dans undo/redo. Comme une solution de contournement pour 10.5 j'ai changé ManagedObjectContext pour permettre d'annuler et de refaire avec des observations de travail http://github.com/mbrugger/CoreDataDependentProperties/blob/master/LPAutomatedObserving/Classes/LPManagedObjectContext.m –

0

Les tables ne contiennent généralement pas NSManagedObjects. Au lieu de cela, NSArrayController fournit les attributs des objets gérés en tant que valeurs via des liaisons ou un objet conforme NSTableViewDataSource. La suppression d'un objet sélectionné fourni dans l'un ou l'autre de ces scénarios peut se faire de plusieurs façons. Le problème est, vous n'avez pas expliqué du tout comment votre cas est mis en place.

Est-il possible que votre suppression (quelle que soit la cible/l'action à laquelle votre bouton est connecté) soit passée nulle ou quelque chose d'inattendu? Je peux imaginer une erreur similaire si vous avez demandé à un contexte d'objet géré de supprimer une valeur flottante ou une autre chose aléatoire ...

+0

Je suis désolé d'avoir été un peu rapide dans la description. C'est comme vous dites un NSArrayController qui détient les objets, et est lié à un NSTableView. J'ai essayé de mettre un chèque quand l'objet que je vais supprimer est correct, et c'est le cas. Il n'y a rien de mal à cela. L'erreur survient aussi quelques instants plus tard (1 ou plusieurs runloops) –

+0

Ssssooooo ..... comment effacez-vous * exactement * l'objet? Comment * exactement * sont les choses liées? Aidez-nous à vous aider. –

+0

Les liaisons sont complètement après le livre. NSArrayController défini en mode entité et mon objet en tant que nom d'entité. La table est liée pr. colonne sur une propriété. Je ne pense pas que le problème soit là. - J'ai essayé différentes méthodes de suppression. Ils produisent tous la même erreur (à la fois [arrayController removeObject: theObject] et [managedObjectContext deleteObject: theObject]) mais comme je le dis, l'erreur est également lorsque j'appuie sur Annuler. Donc juste par sayin ajouter un objet -> Annuler l'erreur est produite. Une idée de ce que l'erreur signifie réellement? –

Questions connexes