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

2023-12-14

我有很多日历,每个日历都有很多事件。我想查找日期 > 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:]:此类与键事件的键值编码不兼容。”


一些想法:

  1. 在你的模型中,是newRelationship真的叫calendar?
  2. 你想重命名Events to events遵循命名约定(实体如Event and Calendar是大写的,而像这样的属性discipline和诸如此类的关系events均为小写)
  3. 接线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(使用前将#替换为@)

一对多关系 iPhone - NSPredicate 核心数据查询 的相关文章

随机推荐