核心数据查询,NSPredicate

时间:2011-07-04 20:50:22

标签: iphone objective-c core-data nspredicate

我有一个名为“Sessions”的实体,它包含一个NSDate属性。

我想要的是能够查询核心数据模型并获得NSDates的DAYS数组,而不需要任何重复。

例如,如果我星期四有5个会话,星期五有2个星期日,星期日有1个会话,我想要一个“星期四”,“星期五”,“星期天”的数组。

(它不一定要有那种字符串格式,这部分我可以弄清楚并修改自己。)

采用这种方法的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

你做不到。这不是NSPredicate的用途。您必须获取Session个对象,并为每个对象找出它所在的日期。它会是这样的:

NSArray *sessions = ...; // an array of Session objects
NSMutableSet *days = [NSMutableSet set];
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"EEEE"]; // this is the name of the day of the week, spelled out
for (Session *session in sessions) {
  NSDate *d = [session date];
  NSString *dayOfWeek = [f stringFromDate:d];
  [days addObject:dayOfWeek];
}
[f release];
NSLog(@"days: %@", days);

请注意,由于我们使用的是NSSet,因此一周的日期将无序。

答案 1 :(得分:0)

我认为你不能得到你想要的查询结果。您可以使用-[NSFetchRequest setReturnsDistinctObject:]仅返回具有唯一NSDate值的结果,但由于您只关心一周中的某一天,因此可能会运气不佳。

但是,您可以将实体中的星期几存储为整数,然后搜索它。

您还可以获取所有Sessions实体,然后从那里构建一周中的日期字典(其中results数组是包含所有已获取会话的数组):

// This date formatter will return a string with the full weekday, i.e. "Monday"
NSDateFormatter *dfText = [[NSDateFormatter alloc] init];
[df setDateFormat:@"EEEE"];

// This date formatter will return a string with the number of the weekday, i.e. "1"
NSDateFormatter *dfNumber = [[NSDateFormatter alloc] init];
[df setDateFormat:@"c"];

NSMutableDictionary *weekdays = [NSMutableDictionary dictionary];

for (Session *curSession in resultsArray) {

    NSString *weekdayNumber = [dfNumber stringFromDate:curSession.Date];

    if (![weekdays objectForKey:weekdayNumber]) {
        [weekdays setObject:[dfText stringFromDate:curSession.Date] forKey:weekdayNumber];
    }

}

[dfText release];
[dfNumber release];