2010-03-16 4 views
0

bâtiment sur this question, j'ai réussi à utiliser défaire les groupes et un contexte unique objet géré à la poignée en ajoutant un Cocktail qui peut faire référence existant Ingredients et/ou Brands.NSPredicate d'exclure NSManagedObjects qui ne sont pas enregistrés dans un NSFetchedResultsController

Maintenant, je suis coincé avec une interface utilisateur nit - dans le contrôleur de résultats récupérés (triés par cocktail.name), vous pouvez voir brièvement une ligne vide pour le Cocktail à ajouter. Marcus Zarra a suggéré:

Vous pouvez ajouter au prédicat pour filtrer les objets non sauvegardés, par exemple en utilisant (entity.isTemporaryID == NO).

mais chaque itération j'ai essayé revient avec des erreurs de forme

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath entity.isTemporaryID not found in entity <NSSQLEntity Cocktail id=4>'

Comment peut-on exécuter l'équivalent de [[cocktail objectID] isTemporaryID] dans un NSPredicate?

Répondre

1

L'appel est sur ObjectId pas l'objet géré:

BOOL isTemporary = [[managedObject objectID] isTemporaryID]; 

Voir cette section du Core Data Programming guide pour plus de détails.

Je ne suis pas sûr de savoir pourquoi vous voyez une ligne vide pour une entité non ajoutée. Si l'entité n'a pas été ajoutée, elle doit être récupérée par le contrôleur de résultats récupérés. Il semble que vous ayez inséré l'entité dans le contexte mais que vous ne l'avez pas encore remplie.

Si tel est le cas, vous pouvez utiliser un prédicat pour exclure les entités dont certaines ou toutes leurs propriétés sont vides. Si vous finissez souvent par le faire, vous pourriez vouloir ajouter une propriété flag à la classe qui retournera NO (via un getter personnalisé) si l'entité n'est pas dans un état à afficher.

+0

Votre cas est correct: l'entité a été ajoutée mais pas encore renseignée dans le contrôleur de détail. J'espérais utiliser un prédicat sur l'objectID temporaire plutôt que de rechercher des clés vides ou d'ajouter un indicateur au modèle de données. – iPhoneDollaraire

+0

Vous avez également la possibilité de créer d'abord l'objet, puis de l'ajouter ultérieurement au contexte de l'objet géré. Si vous le faites de cette façon, l'objet ne s'affiche pas dans les extractions jusqu'à ce que vous l'ajoutiez. – TechZen

0
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath entity.isTemporaryID not found in entity <NSSQLEntity Cocktail id=4>' 

Comment peut-on exécuter l'équivalent de [cocktail [objectID] isTemporaryID] dans un NSPredicate?

Faites cela. Ce que vous avez demandé n'est pas [[cocktail objectID] isTemporaryID], [[cocktail entity] isTemporaryID]. Si vous voulez objectID (ce que vous faites, puisque vous voulez lui demander s'il s'agit d'un ID temporaire), alors c'est ce que vous devez demander dans votre chemin clé.

Vous devriez lire le Key-Value Coding Programming Guide, même si vous avez déjà lu, et rechercher les méthodes entity et objectID dans the NSManagedObject reference. De ceux-ci, vous trouverez clairement que Marcus Zarra soit mélangé les deux ou signifiait objectID mais tapé entity par accident. Cela arrive à tout le monde - c'est pourquoi il est bon de toujours vérifier les documents.

+0

D'accord - mais ce que je cherche, c'est l'effet de cette méthode Objective-C dans le prédicat lui-même, de sorte que le contrôleur de résultats récupérés ne liste pas l'entité non enregistrée. – iPhoneDollaraire

+0

Je comprends que (bien, tout jusqu'à "pour que" -Je ne suis pas un développeur iPhone, donc je ne sais rien des contrôleurs de résultats récupérés). Vous aurez le prédicat appeler cette méthode, en nommant cette méthode dans le chemin de la clé. Encore une fois, consultez le Guide de programmation KVC. –

Questions connexes