Vous pouvez écrire un NSPredicate contre des relations comme vous le feriez pour des attributs.
Par exemple:
- (BOOL)isPerson:(Person *)person memberOfNetwork:(Network *)network {
// assume NetworkMember entity is ivar networkMemberEntity_
// assume NSManagedObjectContext is ivar context_
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:networkMemberEntity_];
[fetch setPredicate:[NSPredicate predicateWithFormat:
@"(person == %@) AND (networks CONTAINS %@)", person, network]];
[fetch setFetchLimit:1];
NSError *error = nil;
NSInteger count = [context_ countForFetchRequest:fetch error:&error];
if (count < 0) {
// always handle errors in real code
// and never check for errors using "error == nil"
}
return count > 0;
}
Dans le cas où vous présentez, cependant, vous devriez sérieusement considérer si vous avez vraiment besoin de le faire. Il semble que vous essayez de modéliser une relation plusieurs-à-plusieurs entre la personne et le réseau. Si vous venez d'un arrière-plan de base de données, vous pourriez penser que vous avez besoin d'une table de jointure pour cela et créer une entité intermédiaire. Toutefois, Core Data peut gérer tout cela pour vous; vous pouvez créer une relation plusieurs-à-plusieurs directement entre la personne et le réseau et ne pas avoir à gérer vous-même une entité ou une table intermédiaire. Tout comme vous n'avez pas à vous soucier des clés primaires et étrangères lorsque vous traitez des relations dans les données de base, le framework traite ce genre de chose pour vous, vous permettant de travailler au niveau de l'objet.
Merci beaucoup, c'est ainsi que j'espérais que cela pourrait être fait. :-) – niklassaers
Juste une petite correction: fetch devrait être libéré à un certain point, soit en appelant autorelease après init ou en envoyant une version avant le retour. Incidemment, Chris, vos articles de blog ont été d'une aide énorme avec d'autres problèmes de données de base, alors merci! –