2013-08-28 1 views
2

Supposons que j'ai une entité A avec des milliers d'objets. Chacun de ces objets a une relation un-à-plusieurs avec une autre entité B. Un attribut de l'entité B est "section".Comment extraire le NSSet de tous les attributs d'une relation un-à-plusieurs B de tous les objets A

Je veux que le NSSet de toutes les sections distinctes de B parmi tous les objets de l'entité A.

si je ne veux que les sections distinctes de B pour un objet de A, je voudrais utiliser:

[A valueForKeyPath:@"B.section"]; 

Mais existe-t-il un moyen efficace d'obtenir ceci pour TOUS les objets de A? Il me semble qu'obtenir tous les objets de A et ensuite itérer sur ce tableau, en exécutant ce qui précède est «trop de travail». Bien sûr, cela peut se faire sans trop de problèmes, mais j'espère que ma naïveté des données de base signifie simplement que je ne connais pas l'astuce pour accomplir cela en une ligne.

Comment cela peut-il être fait?

Merci!

Modifier des éclaircissements demandés:

Supposons qu'une personne a une entité à plusieurs avec une entité Véhicules. Supposons que l'entité Vehicles possède un attribut 'color'.

Je veux un NSSet de toutes les couleurs pour tous les véhicules appartenant à toutes les personnes.

+0

'[a valueForKeyPath: @ "B.section"],' ne vous donnera pas de sections distinctes B, il vous donnera toutes les sections de B. – memmons

+1

S'il vous plaît préciser votre question un peu - - JE' Je l'ai lu 3x et on ne sait toujours pas quel jeu vous cherchez. Voulez-vous un ensemble de toutes les entités B pour une section donnée unique? Voulez-vous un ensemble de toutes les entités B filtrées par des sections uniques? – memmons

Répondre

1

Si je comprends bien, et en supposant que l'A -> relation B a une inverse B -> une relation nommée a, votre question pourrait être formulée comme: Toutes les valeurs distinctes de B.section où la relation B.a n'est pas nul. Cela obtiendrait chaque valeur distincte de B.section pour chaque B associée à A.

Dans ce cas, vous voulez quelque chose comme:

// Fetch B 
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"B"]; 
// Fetch B that's related to an A 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"a != nil"]; 
[request setPredicate:predicate]; 

// Fetch distinct values of "section", return values as NSDictionary 
[request setResultType:NSDictionaryResultType]; 
[request setReturnsDistinctValues:YES]; 
[request setPropertiesToFetch:@["section"]]; 

Execute que et vous obtenez un tableau de NSDictionary. Les dictionnaires ont une clé nommée section qui correspond à B.section. Seules les valeurs distinctes sont incluses.

0

En supposant que vous avez la classe d'objets gérés suivant:

@interface A: NSManagedObject 

@property (nonatomic, retain) NSSet *BSet; 

@end 

Si vous avez une instance de A appelé aObj et que vous voulez récupérer tous les objets BPlacez avec des sections uniques, vous feriez les éléments suivants:

NSArray *uniqueBSections = 
        [aObj valueForKeyPath:@"@distinctUnionOfObjects.BSet.section"]; 
+0

En fait, je pense que [aObj valueForKeyPath: @ "B.section"] ferait ce que vous décrivez. La différence entre ceci et ce que je veux, c'est que j'ai besoin du NSSet pour TOUS les objets de A, pas seulement une seule instance d'aObj. Merci pour la réponse si! – OneManBand

Questions connexes