【问题标题】:One to Many relationships iPhone - NSPredicate core data query一对多关系 iPhone - NSPredicate 核心数据查询
【发布时间】: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:]:此类不符合键事件的键值编码。”

【问题讨论】:

    标签: iphone iphone-sdk-3.0 core-data


    【解决方案1】:

    一些想法:

    1. 在你的模型中,newRelationship 真的叫calendar吗?
    2. 您希望将 Events 重命名为 events 以遵循命名约定(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 编程的一个很好的参考是 Apple 恰当地命名为 NSPredicate Programming Guide

    【讨论】:

    • 谢谢,所以你必须使用 (name like '%@') 你不能使用对象 id 作为参考?
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 2012-03-08
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多