首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带关系的CoreData NSPredicate

带关系的CoreData NSPredicate
EN

Stack Overflow用户
提问于 2013-05-24 13:37:31
回答 3查看 221关注 0票数 0

我有以下CoreData对象模型

现在,我在使用以下条件进行谓词时遇到了问题。

获取所有位于以下位置的DBOpportunity

DBOpportunity.stateCode == 1

DBOpportunity.invoiceDate >= GIVEN_DATE

DBOpportunityLines.crmAccept == 1或DBOpportunityLines.crmAccept == 3

我已经尝试了很多示例和apple的编程指南,但都不能做到这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-24 14:58:10

opportunitylines是一种多对多关系,因此一个DBOpportunity对象有多个DBOpportunityLines对象。假设最后一个条件

DBOpportunityLines.crmAccept == 1或DBOpportunityLines.crmAccept == 3

对于任何相关对象,您都需要一个SUBQUERY:

代码语言:javascript
运行
复制
NSDate *givenDate = ...;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"stateCode == 1 AND invoiceDate >= %@ "
    "AND SUBQUERY(opportunitylines, $x, $x.crmAccept == 1 OR $x.crmAccept == 3).@count > 0",
    givenDate];

备注:不幸的是,SUBQUERY在谓词中的用法很少有文档记录。在NSExpression类引用中有one example。另请参见Quick Explanation of SUBQUERY in NSPredicate Expression

票数 3
EN

Stack Overflow用户

发布于 2013-05-24 14:14:09

谓词的结构是A && B && (C || D)

设置你的谓词

代码语言:javascript
运行
复制
NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"stateCode == %d", value];
NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"invoiceDate >=  %@", givenDate];

cPredicate和dPredicate也是如此。然后先用OR将c和d组合起来

代码语言:javascript
运行
复制
NSArray *cdPredicateArray = @[cPredicate, dPredicate];
NSPredicate *cdPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:cdPredicateArray];

然后所有的数据都带有和

代码语言:javascript
运行
复制
NSArray *allPredicateArray = @[aPredicate, bPredicate, cdPredicate];
NSPredicate *allPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:allPredicateArray];

如果我误解了您问题,而您的结构是A && B && C || D,那么您必须首先将A、B和C组合(与AND),然后将结果与D(与OR)组合。

票数 2
EN

Stack Overflow用户

发布于 2013-05-24 15:18:15

您还可以获取opportunityLines,然后获取父实体,如下所示:

代码语言:javascript
运行
复制
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"opportunityLines" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSDate *yourDate = [NSDate date];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(crmAccept==1 OR crmaccept==3) AND opportunity.stateCode==1 AND opportunity.invoiceDate>=%@", yourDate];
[fetchRequest setPredicate:predicate];

NSError *error;

//So here you have your array of opportunitylines
NSArray *opportunityLines = [context executeFetchRequest:fetchRequest error:&error];

//And this is how you get your opportunity objects
NSArray *opportunities = [opportunityLines valueForKeyPath:@"@distinctUnionOfObjects.opportunity"];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16728294

复制
相关文章

相似问题

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