2009-11-20 99 views
1

我有一个日历数量,每个日历都有许多事件。我想查找日期> x的日历的所有事件。一对多关系iPhone - NSPredicate核心数据查询

我的方法签名看起来像这样

-(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:]:该类不是关键事件编码的关键值。'

回答

4

的几点思考:

  1. 在你的模型中,newRelationship真的叫calendar
  2. 要重命名Eventsevents遵循命名约定(如EventCalendar实体资本,而像discipline属性和关系就像events是小写)
  3. 线了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编程的一个很好的参考,苹果的恰当名为NSPredicate Programming Guide

+0

谢谢,所以你必须使用(名字像'%@')你不能使用对象ID作为参考? – 2009-11-20 14:41:06