我正在尝试将数据分成“记录日期”和“记录日期”。然后,对于每个部分,数据将按' 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,值DESC并按elementName对它们进行分组),它确实可以正常工作。请注意,recordDate是一个'日期'输入数据模型和类中的NSDate。
此外,recordDate包含分钟和分钟。需要将其分组到该细节的秒数。
我试图在整个互联网上搜索类似的案例,但我还没有找到任何可行的解决方案。我的代码中有什么错过的?或者它只是一个Apple bug?感谢您的时间和帮助。
答案 0 :(得分:1)
我终于明白了:
显然,这也是保存在Core Data中的亚秒级信息,使日期之间的比较(即使被比较的日期共享完全相同的日期)不起作用。
所以我做的是在将子秒信息保存到Core Data之前删除它:
self.recordDate = [NSDate dateWithTimeIntervalSinceReferenceDate:floor([recordDate timeIntervalSinceReferenceDate])];
我希望这可以帮助任何面临同样问题的人。干杯!
答案 1 :(得分:0)
是的,如果你想要你的子分类描述符(基于elementName),那么你需要关于recordDate的一些联系,所以你截断recordDate的想法是好的。事实上,很多时候,NSDate信息被截断为YY:MM:DD,因此属于同一天的所有事件都难以区分。
顺便说一句,通常只有你的sectionNameKeyPath需要“粗粒度”,例如,你通过从recordDate中删除亚秒信息来创建一个新的transient属性,并将THAT作为sectionNameKeyPath提供给NSFetchedResultsController。换句话说,你可以继续使用recordDate ......
这类似于姓氏排序(Ascending,比如说),其中节名称是A,B,C,...,Z。