我有很多日历,每个日历都有很多事件。我想查找日期 > 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;
}
替代文本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:]:此类与键事件的键值编码不兼容。”
一些想法:
- 在你的模型中,是
newRelationship
真的叫calendar
?
- 你想重命名
Events
to events
遵循命名约定(实体如Event
and Calendar
是大写的,而像这样的属性discipline
和诸如此类的关系events
均为小写)
- 接线
calendar
and 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
编程是苹果公司的恰当名称NSPredicate Programming Guide.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)