好吧,假设我已经正确地理解了问题,我会这样做。假设你有两个实体,TopEntity有一个(NSString *)名称属性和一个多对多的MyEntity关系,它有一个(NSString *)数据属性和(NSInteger)次序属性。
比方说你想匹配一个给定的字符串,而其myEntity所订单满足一定条件,那么你可以用两个谓词做和NSFetchRequest像这样将TopEntity对象....
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);
}
所以,基本上你可以用另一个谓词来包装你的获取请求的结果并使用ANY关键字。
我不知道这是多高效,但它适用于这种情况。运行上述操作将输出“This is Your Name”,即它与第一个TopEntity匹配。
我一直希望能够通过单一的谓词获取来完成它,但我开始认为它无法完成。我感觉使用额外的属性 - 反规范化 - 可能是最好的方式,性能也是。 – 2010-11-26 21:34:46
当然,每个对象搜索一次获取请求的方法对于大量搜索对象来说是非常浪费和不合理的,但对于小列表来说,它可能是一个合理的命中。我个人使用“lastN”标志方法。我认为(但不要引用我)关系自动意味着与核心数据的多次往返。 – 2010-11-26 21:44:47