2010-05-19 7 views
0

J'ai des objets Client, Événement et Adresse dans mon modèle de données. Le client et l'adresse ont tous deux une relation un-à-plusieurs avec Event.Comment interroger/filtrer une relation à plusieurs dans les données de base

Je peux obtenir la liste distincte des adresses pour les événements d'un client pour en faisant ceci:

NSSet *addressSet = [customer valueForKeyPath:@"events.address"]; 

Pour la partie de l'interface utilisateur, je travaille maintenant, je dois afficher l'adresse de la plus événement récent avant maintenant qui a une adresse.

Je commence à créer une requête NSFetchRequest, à définir son entité, à trier des descripteurs, à prédire puis à faire défiler les résultats, mais cela semble être beaucoup de code. Ai-je manqué un moyen évident de filtrer/trier la relation "événements" de l'objet Client ou est-ce que la création de NSFetchRequest est la meilleure solution?

+0

Il est utile d'accepter la réponse (si vous pensez que c'est juste :) afin qu'elle puisse augmenter votre réputation ici pour de futures questions. –

Répondre

1

Ceci est en fait assez simple en raison des accesseurs KVO et KVC qui sont disponibles sur NSSet et NSArray.

NSSet *eventsWithAddress = [[customer valueForKey:@"events"] filteredSetWithPredicate:[NSPredicate predicateWithFormat:@"address != nil"]]; 
id mostRecentEvent = [eventsWithAddress valueForKeyPath:@"@max.lastDate"]; 

Bien sûr, le nom de la propriété est à vous car je ne vois pas votre modèle de données, mais qui vous donne une idée générale de l'endroit où le code doit aller. Vous pouvez voir quels opérateurs sont disponibles dans la documentation d'Apple.

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/ArrayOperators.html

AVERTISSEMENT: Le code écrit dans la fenêtre de commentaires StackOverflow donc vous aurez probablement besoin de ruser un peu.

+0

Merci, cela m'a mis sur la bonne voie. J'avais oublié à propos de filterSetUsingPredicate. Tout ce que j'avais besoin d'ajouter à votre code était lastDate étant inférieur à la date/heure actuelle. –

Questions connexes