2010-03-11 7 views
7

Je suis nouveau aux données de base et essaye d'obtenir tous les objets enfants de différents types avec une requête. Dites qu'il y a un type "animal" comme parent et "chat", "chien" et "oiseau" comme enfants. Je voudrais avoir les deux chats et chiens, mais pas Birds dans une seule requête retourné en tant qu'objets animaux. C'est possible?Comment utiliser NSPredicate pour capturer des objets enfants?

Répondre

5

Managed objects have an entity property, donc vous devriez être en mesure de combiner Kevin Sylvestre's solution avec a predicate de entity.name != "Bird".

+0

entité est une méthode, pas une propriété .. – cocoapriest

+1

C'est une propriété informelle, dans la mesure où vous pouvez utiliser KVC pour y accéder (puisqu'il y a une méthode là), par opposition à un formel ('@ property') propriété. –

+0

Vous ne pouvez pas utiliser cette méthode avec un magasin SQLite car la propriété 'entity' n'est pas disponible lorsque les objets sont en défaut. Vous n'avez pas vraiment le choix de faire une étape de filtrage post-récupération. –

3

Oui, il est possible:

// Load delegate from application and context from delegate. 
SampleAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *context = delegate.managedObjectContext; 

// Create new request. 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

// Create entity description using delegate object context. 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Animal" inManagedObjectContext:context]; 

// Set entity for request. 
[request setEntity:entity]; 
[request setIncludesSubentities:YES]; 

// Load array of documents. 
NSError *error; 
NSArray *animals = [context executeFetchRequest:request error:&error]; 

// Release request. 
[request release]; 

// Access array. 
for (id animal in animals) { } 
+0

Merci pour la réponse rapide. Je suis désolé, j'ai oublié de mentionner la chose la plus importante: il y a un autre enfant (disons "Bird"). Ce dont j'ai besoin, c'est d'avoir à la fois des chats et des chiens, mais pas des oiseaux. J'ai édité la question principale – cocoapriest

0

Bien que ce (entity.name != "Bird") puisse fonctionner si vous avez seulement "Chat", "Chien" et "Oiseau", cela ne fonctionne pas si vous ajoutez plus tard "Animaux". Vous pouvez également utiliser entity.name == "Dog" && entity.name == "Cat"

C'est un cas de "... auras-tu jamais d'autres animaux, dans ton cas, des animaux?" Amusez-vous =)

Questions connexes