首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有更有效的方法来找到一个与我拥有的两个对象具有一对一关系的对象?

有没有更有效的方法来找到一个与我拥有的两个对象具有一对一关系的对象?
EN

Stack Overflow用户
提问于 2011-03-15 13:35:43
回答 2查看 226关注 0票数 0

我有以下核心数据设置:

代码语言:javascript
复制
Project has-many Answer
Field has-many Answer
Answer has-one Field
Answer has-one Project

我需要找到每个领域的答案,也拥有项目。我目前对此使用了一个谓词并执行了一个fetch请求:

代码语言:javascript
复制
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对象?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-16 06:00:39

如果我理解正确的话,您已经有了一个Field对象和一个Project对象,并且您希望找到它们共有的Answer对象。

如果是这样的话,解决方案是一个简单的交集操作:

代码语言:javascript
复制
NSSet *answersInCommon=[[aFieldObj mutableSetValueForKey:@"answers"] intersectSet:[aProjectObj mutableSetValueForKey:@"answers"]];

..。这将只返回在这两个关系中出现的那些Answer对象。

更新:

@pdenya在评论中提供了一个增强:

我只想澄清一个小错误和一个不太理想的小问题。intersectSet返回(空),因此其语法为:

代码语言:javascript
复制
NSMutableSet *answers=[field mutableSetValueForKey:@"answers"]; 
[answers intersectSet:[project mutableSetValueForKey:@"answers"]]; 

这个解决方案还修改了aFieldObj.answers数组,这意味着您不能在迭代时使用它。setWithSet马上就会澄清这一点。示例:

代码语言:javascript
复制
NSMutableSet *answers = [NSMutableSet setWithSet:[project mutableSetValueForKey:@"answers"]]; 
[answers intersectSet:[field mutableSetValueForKey:@"answers"]];

@pdenya的是正确的形式。

票数 1
EN

Stack Overflow用户

发布于 2011-03-15 22:10:20

到目前为止我找到的最好的替代方法:

代码语言:javascript
复制
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];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5307899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档