10
votes

Données de base NSInvalidargumentException erreur

Je reçois un crash lors de la modification d'un attribut bool de mon nsmanagedObject.

Le code pour enregistrer l'objet est le suivant: p> xxx pré>

et l'erreur: p >

Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet. with userInfo (null)
2011-08-18 15:41:32.866 Codes[5260:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet.'


2 commentaires

Vous devez ajouter plus de code - à quoi ressemble votre détailItem; Est-ce juste un nsmanagedObject?


Ouais, le détaillanttem est juste un nsmanagedObject avec un attribut BOOL appelé Bookmark .


3 Réponses :


8
votes

AVERTISSEMENT: Cette réponse est basée sur une supposition que j'ai faite en fonction du message d'erreur; Cela peut être 100% erroné!


L'erreur ressemble à ce que c'est un NSpredicate code>. Vous pourriez avoir quelque chose comme p> xxx pré>

qui semble trouver quoi que ce soit sur lequel name = 'bob' code> mais il ne le fera pas, ça va lancer un Exception: ( p>

si vous utilisez "dans", vous devez passer un nsset ou nsarray, c'est-à-dire. p> xxx pré>

Ceci trouvera quelque chose avec le nom 'Bob' ou 'Alice'. P>

Si vous vouliez simplement rechercher 'Bob', faites cela: P>

NSString *name = @"Bob";
[NSPredicate predictaeWithFormat:@"%K == %@", @"name", name];


7 commentaires

Il n'y a pas de prédicat dans cette VC. Cependant, j'ai séparé VC qui a ce prédicat [nspredicate prédicatwithFormat: @ "tout bookmark == oui"]; y a-t-il quelque chose de mal?


L'erreur implique que c'est un autre objet qui est intéressé par les modifications apportées à votre objet géré, ce qui cause l'exception afin que cela puisse être ce prédicat. Essayez-le sans le 'aucun »et voyez ce qui se passe?


Essayé cela mais j'ai toujours un crash. Pour le VC, nous travaillons avec tout le code que j'ai lié à l'objet, l'objet est poussé de la vue parent. Je n'ai pas de code MOC car l'objet devrait tirer le MOC lui-même.


C'est le prédicat car "tout bookmark == oui" n'est pas valide. Le crash est causé par le prédicat perturbant le graphique d'objet qui ne devient pas apparent avant de sauvegarder le contexte. Les erreurs de sauvegarde ne doivent pas nécessairement être liées au code immédiatement avant la sauvegarde. Toute erreur qui accumule dans le contexte peut ne pas être apparente avant une opération de sauvegarde.


Votre hypothèse était correcte pour mon cas d'obtenir exactement la même erreur de Coredata. Supprimer un prédicat incorrect supprime le crash.


Remarque: vous devriez JAMAIS Utiliser n'importe lequel et dans la même expression de prédicat, cela peut provoquer des accidents! La chose étrange est que cela pourrait fonctionner plusieurs fois et crash dans d'autres, exactement le même prédicat! Il suffit de terminer la réparation d'un bug de crash causé exactement en utilisant n'importe lequel et dans la même expression de prédicat. Bit plus de clarification: tout est utilisé pour les relations, vous ne doit jamais l'utiliser pour une expression d'attribut simple.


Avez-vous un exemple des crashs que vous obtenez - j'utilise tout..in .. dans les applications en direct depuis quelques années et n'a pas eu de crash jusqu'à présent. . ou ma déclaration de crash est cassée;)



4
votes

Je pense que Deanwornbourne a écrit la bonne réponse, mais ce n'était pas très clair pour moi, alors je vais reformuler sa réponse et ses idées et fournir une explication supplémentaire.

Programguy a obtenu l'erreur d'application sérieuse car son prédicat était faux. La raison pour laquelle tout bookmark == Oui est faux, c'est que "tout" n'est utilisé que lorsque vous avez une relation unique dans votre modèle. Lorsque vous avez une relation unique, vous devez utiliser bookmark == Oui .

L'erreur d'application sérieuse est un peu idiote et provoque plus d'alarme que nécessaire. Cependant, cela vous donne un très bon indice à l'erreur. Il dit qu'il y a un "bug dans un observateur.". Cela signifie que vous avez des " nsfetchedresults 'objet ou' nsfetchedResultSluTroller '' (puisque nous parlons du nsmanagedObjectContextObjectChangeDNotification ). En outre, le message d'erreur indique Le côté gauche de gauche pour un tout ou n'importe quel opérateur doit être soit un nsarray ... Cela signifie qu'il doit y avoir une relation une à plusieurs.

Espérons que cela aide.


0 commentaires

0
votes

juste un fyi. La réponse de Deanwombourne était 100% correcte dans mon cas. XXX

Après avoir retiré le problème du problème a été résolu. Merci mon Dieu pour Dean! Je viens de m'avoir sauvé de nombreuses heures de dépannage et de maux de tête.


0 commentaires