0

我想按'recordDate'将数据分成不同的部分,然后对于每个部分数据将按'elementName'按升序排序。以下是当前代码(不工作):当第一个描述符是NSDate时,多个NSSortDescriptor不工作

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]; 

然而,当我尝试使用其他属性进行排序(例如:ASC的ElementName,价值DESC并将它们按的ElementName)它的工作,因为它应该。请注意,recordDate是数据模型中的'Date'类型和类中的NSDate。

另外recordDate包含分钟&秒,它需要分组到这个细节。

我试图搜索整个互联网类似的情况下,但我还没有找到任何解决方案的工作。我在代码中错过了什么?还是仅仅是一个苹果的错误?感谢您的时间和协助。

+0

如果从第二个排序描述符中删除选择器会发生什么? CoreData对数据库中的东西进行排序,因此您不能使用自定义选择器或比较器进行排序描述符。 – 2012-08-15 09:59:52

+0

如果我删除选择器,没有什么改变。 – 2012-08-15 15:11:59

回答

1

我终于想通了:

显然它也被保存到核心数据使不工作的日期之间的比较(即使日期进行比较的份额完全相同的日期)的亚秒级的信息。

所以我所做的就是将其保存到核心数据之前移除亚秒级信息:

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

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

0

是的,如果你想要你的subsorting描述符(基于elementName)踢,那么你需要一些关于recordDate的关系,所以你截断recordDate的想法是好的。事实上,很多时候,NSDate信息被截断为YY:MM:DD,因此属于同一天的所有事件都是不可区分的。另外,通常只有您的sectionNameKeyPath需要“粗粒度”,例如,您通过从recordDate中除去亚秒信息来创建新的瞬态属性,并将THAT作为sectionNameKeyPath馈送给NSFetchedResultsController。换句话说,你可以继续使用recordDate,因为它是...

这将类似于姓氏排序(升序说),其中节名称是A,B,C,...,Z.