2010-09-27 3 views
0

Compte tenu du modèle de données de base suivantes:NSPredicate pour à plusieurs, où une relation (NSSet) doit contenir des entités définies dans un NSArray

-> : to-one releationship 
->>: to-many relationship 

Entity A ->> Entity B 
Entity B -> A // each B belongs to exactly one A 
Entity B ->> B // a B can be related to other B's 

donc en classe A:

@property (nonatomic, retain) NSSet *Bs; 

En classe B:

@property (nonatomic, retain) A *A; 
@property (nonatomic, retain) NSSet *Bs; 

Supposons que j'ai un NSArray *myArray contiennent (Bj, Bk).

Ce que je veux est d'aller chercher tous les B « s qui appartiennent à Ax et sont liés à Bj et Bk:

Le code ci-dessous fonctionne, mais il est tout à fait laid, puisque je dois hardcode la base NSPredicate le nombre (ici il est 2, mais il pourrait être 10 ou si) de B « s dans le tableau:

NSEntityDescription *fetchedEntity = [NSEntityDescription entityForName:@"B" inManagedObjectContext:self.managedObjectContext]; 
[NSPredicate predicateWithFormat:@"A == %@ and (Bs contains %@) and (Bs contains %@)", Ax, [myArray objectAtIndex:0], [myArray objectAtIndex:1]]; 

Comment puis-je réécris le prédicat de sorte qu'il est plus générique ? Il doit être si évident, mais je ne vois tout simplement pas ...

Répondre

2

Est-ce que

[NSPredicate predicateWithFormat:@"A==%@ AND (ALL %@ IN Bs)", Ax, myArray]; 

faire ce que vous attendez? Je ne suis pas sûr (et loin de ma boîte OS X) si ce prédicat est traduisible en SQL pour le moteur SQLite Core Data. Vous devrez peut-être une expression SUBQUERY:

[NSPredicate preidcateWithFormat:@"A==%@ and SUBQUERY(Bs, $x, $x IN %@)[email protected] == %d", Ax, myArray, myArray.count]; 

Cela suppose que les éléments myArray sont uniques.

+0

Thx pour la réponse rapide. Votre première solution déclenche une exception: prédicat non pris en charge (null). Le deuxième fonctionne (devait fixer @count et les disparus). Mais c'est très lent. Ma solution codée en dur prend environ 0.012 secondes, alors que la solution de sous-requête prend environ 10 secondes ... – codeclash

+0

Malheureusement, ce que vous demandez (une solution générale) est un conflit indirect avec une requête SQL efficace contre un moteur relationnel. Je pense que vous devez choisir l'un ou l'autre. Quelle était l'erreur de syntaxe exactement? Je vais corriger le post. –

+0

huh. avez-vous déjà corrigé la requête? ou est-ce que j'ai mélangé votre solution avec celle des documents SUBQUERY? Mon mauvais: Votre solution fonctionne parfaitement, désolé, et elle bascule, le temps moyen est 0.000016 secondes! Je pense que j'ai mélangé votre solution avec un des documents: NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "A ==% @ et (SUBQUERY (Bs, $ x, $ x IN% @). @ Count == Bs. @ compte) ", Ax, myArray, myArray.count]; Celui-ci est vraiment mauvais, prenant environ 10 secondes en moyenne. En raison des Bs. @ Compte! Merci beaucoup, sauvé ma journée! – codeclash

Questions connexes