一对多关系 iPhone - NSPredicate 核心数据查询

Posted

技术标签:

【中文标题】一对多关系 iPhone - NSPredicate 核心数据查询【英文标题】:One to Many relationships iPhone - NSPredicate core data query 【发布时间】:2009-11-20 14:08:16 【问题描述】:

我有许多日历,每个日历都有许多事件。我想查找日期 > x 的日历的所有事件。

我的方法签名是这样的

-(NSArray*)eventsForCalender:(Calendar*)calender StartDate:(NSDate*)start endDate:(NSDate*)endDate;

我向这样的日历添加了一个事件,但我不知道如何为查询构造一个 NSPredicate。任何帮助表示赞赏

-(Event*)newEventforCalender:(Calendar*)calender

    Event * newEvent = (Event*)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:app.managedObjectContext];

    NSMutableSet * eventsArray = [calender mutableSetValueForKey:@"Events"];
    [eventsArray addObject:newEvent];
    [app.managedObjectContext processPendingChanges];

    return newEvent;

alt text http://img4.imageshack.us/img4/5218/screenshot20091120at140.png

我将关系名称更改为“事件”并尝试了以下操作

....
    NSEntityDescription * entity = [NSEntityDescription entityForName:@"Calendar" inManagedObjectContext:app.managedObjectContext];
    [request setEntity:entity]; 

    NSPredicate * predictate = nil;
    predictate = [NSPredicate predicateWithFormat:@"(name == %@) AND (Event.start > '%@') AND (Event.finish < '%@')", calender.name, start, endDate, nil];
    [request setPredicate:predictate];
...

但是我遇到了一个异常

由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[valueForUndefinedKey:]:此类不符合键事件的键值编码。”

【问题讨论】:

【参考方案1】:

一些想法:

    在你的模型中,newRelationship 真的叫calendar吗? 您希望将 Events 重命名为 events 以遵循命名约定(EventCalendar 等实体大写,discipline 等属性和 events 等关系为小写) 在两个方向上连接 calendarevents 关系

说了这么多,您可以使用如下谓词:

- (NSArray *) eventsForCalendar:(Calendar *)calendar startDate:(NSDate *)startDate endDate:(NSDate *)endDate 

    NSPredicate *_predicate;
    NSString *_predicateStr;
    NSSet *_calendarQueryResults;

    _predicateStr = [NSString stringWithFormat:@"(name like '%@') AND (event.start > '%@') AND (event.finish < '%@')", calendar.name, startDate, endDate];
    _predicate = [NSPredicate predicateWithFormat:_predicateStr];
    _calendarQueryResults = [_managedObjectContext fetchObjectsForEntityName:@"Calendar" withPredicate:_predicate];

    return [_calendarQueryResults allObjects];

如果日历名称足以唯一标识单个日历,这将起作用。如果您有两个同名日历,则必须添加额外的搜索条件,例如 @"(category like '%@') ... ", calendar.category, ...

您也可以使用对象 ID:

_predicateStr = [NSString stringWithFormat:@"(SELF == %@) AND (event.start > '%@') AND (event.finish < '%@')", calendar, startDate, endDate];

NSPredicate 编程的一个很好的参考是 Apple 恰当地命名为 NSPredicate Programming Guide

【讨论】:

谢谢,所以你必须使用 (name like '%@') 你不能使用对象 id 作为参考?

以上是关于一对多关系 iPhone - NSPredicate 核心数据查询的主要内容,如果未能解决你的问题,请参考以下文章

一对多关系 iPhone - NSPredicate 核心数据查询

在 iPhone 应用程序中显示一对多关系的值的计数

iPhone Core Data - 访问具有多种关系的深层属性

iOS / iPhone CoreData 关系

可可 iphone 核心数据谓词一对多 fetchrequest

CoreData 和一对多关系的并发错误