2010-10-07 12 views
0

J'ai donc typique 1: relation M:de base de données, filtrage des entités enfants en jeu de résultats

Car can have many Models 

Je veux tous les objets de voiture et seuls les noms de modèles qui commencent par « A ».

J'ai essayé une sous-requête:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:_context]; 
[fetchRequest setEntity:entity]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(models, $model, $model.name BEGINSWITH 'A')[email protected] > 0"];  
[fetchRequest setPredicate:predicate]; 

Ce serait essentiellement un retour Car tant qu'il a un modèle qui commence par 'A'. C'est très bien, mais pour tous les Car s retour, il retourne aussi tous les Model s, et je veux que ceux qui commencent par « A »

Mais il semble aussi longtemps que je fonctionne sur l'entité de niveau supérieur (voiture), alors cette sous-requête filtre uniquement Cars et ne filtre pas du tout Models. Ce que je suis en train de faire est de filtrer Models dans une boucle interne (en utilisant un autre NSPredicate), mais je préfère faire ce filtrage du côté SQL.

Des idées?

Répondre

1

Exécuter votre exploration, contre l'entité Models avec un prédicat:

[NSPredicate predicateWithFormat:@"name BEGINSWITH 'A'"]; 

à partir du tableau de résultats, NSArray *result, vous pouvez obtenir toutes les Cars avec KVC:

[result valueForKey:@"car"]; 

supposant que vous avez 1 : 1 relations inverses pour votre relation 1: M Cars à Models (vous devriez, en passant, Core Data utilise des relations inverses pour maintenir la cohérence du graphe d'objet).

Si vous voulez juste l'ensemble de Cars unique:

[result valueForKeyPath:@"@distinctUnionOfObjects.car"]; 

ou

NSSet *cars = [NSSet setWithArray:[result valueForKey:@"car"]]; 
+0

Ouais, c'est quelque chose que je suis arrivé à. Travailler d'abord via l'entrée Modèles, puis récupérer les voitures. J'aime ta méthode KVC ici. Merci! – Maverick

Questions connexes