0

我试图通过“recordDate”将数据分成多个部分,然后对于每个部分,数据将按“elementName”升序排序。以下是当前代码(不工作):

NSManagedObjectContext *context = self.tankDatabase.managedObjectContext;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Log"];
request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"recordDate" ascending:NO], [NSSortDescriptor sortDescriptorWithKey:@"elementName" ascending:YES selector:@selector(localizedStandardCompare:)], nil];
request.predicate = [NSPredicate predicateWithFormat:@"ownedBy = %@", self.tank];


self.controller = [[NSFetchedResultsController alloc]
                                          initWithFetchRequest:request
                                          managedObjectContext:context
                                          sectionNameKeyPath:@"recordDate"
                                          cacheName:nil];

self.controller.delegate = self;

NSError *error;
BOOL success = [self.controller performFetch:&error];

但是,当我尝试使用其他属性进行排序(例如:elementName ASC、value DESC 并按 elementName 对它们进行分组)时,它确实可以正常工作。请注意,recordDate 在数据模型中是“日期”类型,在类中是 NSDate。

此外,recordDate 包含需要将其分组到该详细信息的分钟和秒。

我试图在整个互联网上搜索类似的案例,但我没有找到任何可行的解决方案。我的代码中缺少什么?或者它只是一个苹果的错误?感谢您的时间和帮助。

4

2 回答 2

1

我终于想通了:

显然,亚秒级信息也被保存到 Core Data 中,使得日期之间的比较(即使被比较的日期共享完全相同的日期)不起作用。

所以我所做的是在将亚秒信息保存到核心数据之前删除它:

self.recordDate = [NSDate dateWithTimeIntervalSinceReferenceDate:floor([recordDate timeIntervalSinceReferenceDate])];

我希望这可以帮助任何面临同样问题的人。干杯!

于 2012-08-16T06:12:02.037 回答
0

是的,如果您希望您的子排序描述符(基于 elementName)启动,那么您需要与 recordDate 建立一些联系,因此您截断 recordDate 的想法很好。事实上,很多时候,NSDate 信息被截断为 YY:MM:DD,因此属于同一天的所有事件都无法区分。

顺便说一句,通常只有您的 sectionNameKeyPath 需要“粗粒度”,例如,您通过从 recordDate 中删除亚秒信息来创建一个新的瞬态属性,并将其作为 sectionNameKeyPath 提供给 NSFetchedResultsController。换句话说,您可以按原样继续使用 recordDate ...

这类似于姓氏排序(例如,升序),其中部分名称为 A、B、C、...、Z。

于 2014-02-19T09:50:12.230 回答