Eh bien, en supposant que j'ai bien compris le problème, je procéderais comme suit. Disons que vous avez deux entités, TopEntity a une propriété (NSString *)name et une relation to-many avec MyEntity qui a une propriété (NSString *)data et une propriété (NSInteger)order.
Disons que vous voulez les objets TopEntity qui correspondent à une chaîne de caractères donnée, et dont les commandes MyEntity satisfont à une certaine condition, alors vous pouvez le faire avec deux prédicats et une NSFetchRequest comme suit....
NSManagedObjectContext *context = [self managedObjectContext];
// Create some top level entities
TopEntity *aTop = [TopEntity insertInManagedObjectContext:context];
aTop.name = @"This is Your Name";
TopEntity *bTop = [TopEntity insertInManagedObjectContext:context];
bTop.name = @"This aint a Name";
TopEntity *cTop = [TopEntity insertInManagedObjectContext:context];
cTop.name = @"This is My Name";
// Add some data
NSInteger i, len = 30;
for(i=0; i<len; i++) {
// Create a new object
MyEntity *entity = [MyEntity insertInManagedObjectContext:context];
entity.orderValue = i;
entity.data = [NSString stringWithFormat:@"This is some data: %d", i];
if(i < 10) {
[aTop addObjectsObject:entity];
[entity addTopObject:aTop];
} else if (i < 20) {
[bTop addObjectsObject:entity];
[entity addTopObject:bTop];
} else {
[cTop addObjectsObject:entity];
[entity addTopObject:cTop];
}
}
// Save the context
NSError *error = nil;
[context save:&error];
// A predicate to match against the top objects
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH %@", @"This is"];
// A predicate to match against the to-many objects
NSPredicate *secondPredicate = [NSPredicate predicateWithFormat:@"ANY objects.order < %d", 5];
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:[NSEntityDescription entityForName:@"TopEntity" inManagedObjectContext:context]];
[fetch setPredicate:predicate];
NSArray *result = [[context executeFetchRequest:fetch error:&error] filteredArrayUsingPredicate:secondPredicate];
for(TopEntity *entity in result) {
NSLog(@"entity name: %@", entity.name);
}
Donc, essentiellement, vous pouvez simplement envelopper les résultats de votre requête de récupération avec un autre prédicat et utiliser le mot-clé ANY.
Je n'ai aucune idée de l'efficacité de cette méthode, mais elle fonctionne dans ce cas. L'exécution de la commande ci-dessus produira "This is Your Name", c'est-à-dire qu'elle correspond à la première TopEntity.