我有以下核心数据设置:
Project has-many Answer
Field has-many Answer
Answer has-one Field
Answer has-one Project我需要找到每个领域的答案,也拥有项目。我目前对此使用了一个谓词并执行了一个fetch请求:
NSEntityDescription *answerEntity = [NSEntityDescription entityForName:@"Answer" inManagedObjectContext:self.managedObjectContext];
NSPredicate *answerPredicate = [NSPredicate predicateWithFormat:@"ANY project == %@ && field == %@", self.project, self.field];
NSFetchRequest *answerRequest = [[NSFetchRequest alloc] init];
[answerRequest setEntity:answerEntity];
[answerRequest setPredicate:answerPredicate];
NSError *error = nil;
NSArray *predicates = [self.managedObjectContext executeFetchRequest:answerRequest error:&error];我仍然是核心数据的新手,但我相信每次我调用fetchRequest都会查询数据库,有没有更有效的方法来找到这些Answer对象?
发布于 2011-03-16 06:00:39
如果我理解正确的话,您已经有了一个Field对象和一个Project对象,并且您希望找到它们共有的Answer对象。
如果是这样的话,解决方案是一个简单的交集操作:
NSSet *answersInCommon=[[aFieldObj mutableSetValueForKey:@"answers"] intersectSet:[aProjectObj mutableSetValueForKey:@"answers"]];..。这将只返回在这两个关系中出现的那些Answer对象。
更新:
@pdenya在评论中提供了一个增强:
我只想澄清一个小错误和一个不太理想的小问题。intersectSet返回(空),因此其语法为:
NSMutableSet *answers=[field mutableSetValueForKey:@"answers"];
[answers intersectSet:[project mutableSetValueForKey:@"answers"]]; 这个解决方案还修改了aFieldObj.answers数组,这意味着您不能在迭代时使用它。setWithSet马上就会澄清这一点。示例:
NSMutableSet *answers = [NSMutableSet setWithSet:[project mutableSetValueForKey:@"answers"]];
[answers intersectSet:[field mutableSetValueForKey:@"answers"]];@pdenya的是正确的形式。
发布于 2011-03-15 22:10:20
到目前为止我找到的最好的替代方法:
NSMutableSet *answers = [self.project mutableSetValueForKey:@"answers"];
NSPredicate *answerPredicate = [NSPredicate predicateWithFormat:@"field == %@", field];
[answers filterUsingPredicate:answerPredicate];
NSManagedObject *answer = nil;
if([answers count] > 0) {
answer = [[answers allObjects] objectAtIndex:0];
}https://stackoverflow.com/questions/5307899
复制相似问题