【问题标题】:Core Data group NSDate into month/year核心数据组 NSDate 成月/年
【发布时间】:2012-10-16 15:20:17
【问题描述】:

假设我在一个表中有一些 NSDates:

  • 2012 年 1 月 11 日
  • 2012 年 1 月 16 日
  • 2012 年 2 月 14 日
  • 2012 年 4 月 13 日
  • 2012 年 4 月 14 日
  • 2012 年 4 月 18 日

我想按月份和年份对这些日期进行分组,以便得到:

  • 2012 年 1 月
  • 2/2012
  • 2012 年 4 月

我目前求助于获取表中的每条记录,在日期列上执行valueForKeyPath,提取NSDateComponents 并将结果存储在NSSet 中。这似乎有点低效。

我想知道是否有办法编写一个 NSPredicate 来在数据库端对这些日期进行分组。

【问题讨论】:

  • 你有没有从中得到解决方案?我现在也有同样的问题/你能建议我怎么做吗?我仍然没有从接受的 amswer 中理解任何事情

标签: objective-c core-data


【解决方案1】:

我做了类似的事情,我在名为sortDate 的实体中使用了一个额外的属性。 我从自定义日期设置器中设置了 sortDate。

类似这样的:

- (NSDate *)monthDateFromDate:(NSDate *)date {
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit fromDate:date];
    NSDate *monthDate = [calendar dateFromComponents:components];
    return monthDate;
}

- (void)setDate:(NSDate *)date {
    [self willChangeValueForKey:@"date"];
    [self setPrimitiveStartDate:date];
    [self didChangeValueForKey:@"date"];

    NSDate *sortDate = [self monthDateFromDate:date];
    [self willChangeValueForKey:@"sortDate"];
    [self setPrimitiveSortDate:sortDate];
    [self didChangeValueForKey:@"sortDate"];
}

【讨论】:

  • 那么您是否将sortDate 定义为核心数据模型中的瞬态属性?
  • 这是一个保存在数据库中的常规属性。我希望这将使切片更快。根据我的经验,NSDate 计算非常昂贵。虽然我从来没有分析过它,但我很确定比较 sqlite 的 TIMESTAMP 值然后为提取中的每个对象计算一个新的 NSDate 会更快。
  • 此解决方案的唯一问题是时区敏感性。即使您更改时区并将几个我们的日期移动到过去/未来,sortDate 仍将保持不变。
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多