Core Data 获取一对多关系的数据

Posted

技术标签:

【中文标题】Core Data 获取一对多关系的数据【英文标题】:Core Data fetching data of one to many relationship 【发布时间】:2013-04-02 03:07:57 【问题描述】:

我是 Core Data 的菜鸟。我有两个实体场地和音乐会以及两个关系音乐会(从场地到音乐会)和场地(从音乐会到场地)。我想要做的基本上是检索包含在两个日期(startDate-endDate)之间的场地的所有音乐会。

NSPredicate *concertsToShow = [NSPredicate predicateWithFormat:@"ALL concerts.startDate <= %@ AND concerts.endDate >= %@",startDate,endDate];

    NSManagedObjectContext *managedObjectContext = ((AppDelegate *)[[UIApplication sharedApplication]delegate]).managedObjectContext;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"Venue" inManagedObjectContext:managedObjectContext]];
    [request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"concerts", nil]];
    [request setPredicate:concertsToShow];

    NSError *error = nil;
    NSArray *concerts = [managedObjectContext executeFetchRequest:request error:&error];

    return concerts; 

运行代码时出现以下异常:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不支持的谓词(null)”*

我尝试在谓词上也加上括号,但它说它无法解析谓词。

我最终使用了子查询

NSPredicate *concertsToShow = [NSPredicate predicateWithFormat:@"SUBQUERY(concerts, $i, $i.startDate BETWEEN %@,%@).@count>0",startDate,endDate];

问题在于它仅对场地执行过滤:它仅检索具有音乐会的场地,该音乐会的日期包含在 startDate 和 endDate 之间,但相关的音乐会未被过滤。我想要实现的是让这个过滤加上对音乐会的过滤。 因此,例如,我有两个与音乐会相关的场地(示例中仅显示日期): “爱尔兰酒吧”->> (01-04-2013, 02-04-2013,03-04-2013,04-04-2013) “英语酒吧”->> (05-04-2013)

如果我的谓词的 startDate 和 endDate 分别是 02-04-2013 和 04-04-2013 结果应该是:

“爱尔兰酒吧”->> (02-04-2013,03-04-2013,04-04-2013)

【问题讨论】:

好吧,你的问题很清楚:谓词为空??我不认为你必须去这么麻烦,你应该能够制作一个谓词来轻松添加你的约束.. 知道为什么谓词为空吗?? 【参考方案1】:

正如 Rob 所述,您的错误消息说您有 nil 谓词。

所以在发出请求之前放置日志并检查谓词。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ALL concerts.startDate <= %@ AND concerts.endDate >= %@",startDate,endDate];
NSLog(@"my predicate is :%@",predicate);

对于我建议的良好做法,请始终这样做

if(predicate!=nil)
  //now make request here

如果您需要更多帮助,请告诉我。

【讨论】:

我会添加一个日志断点并简单地放入:po 谓词。但是,是的,就是这样!

以上是关于Core Data 获取一对多关系的数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Core Data 一对多关系从 JSON 数组填充 sqlite 数据库

Core Data 获取请求与 NSFetchedResultsController 的一对多关系

在 Core Data 中有效地获取一对多关系中的最新记录

如何处理 CORE DATA 中的一对多关系

将 Core Data 中的一对多显示为一对一

我可以在 Core Data 中获取关系数据吗