一对多关系 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
以遵循命名约定(Event
和 Calendar
等实体大写,discipline
等属性和 events
等关系为小写)
在两个方向上连接 calendar
和 events
关系
说了这么多,您可以使用如下谓词:
- (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 Core Data - 访问具有多种关系的深层属性