按日期排序NSFetchRequest,然后按字母顺序排序。

12

我想按照日期先排序NSFetchRequest,然后如果它们是同一天,再按名称排序。 我使用UIDatePicker选择日期并使用Core Data保存。

[self.managedObject setValue:self.datePicker.date forKey:self.keypath];

并且像这样对 NSFetchRequest 进行排序:

NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"day" ascending:NO];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

现在我的问题是,它只能按日期排序而不能按名称排序,因为UIDatePicker存储在Core Data中的日期还包括小时。所以即使是同一天,由于小时不同,也无法按“名称”对同一天进行排序。 那么,我如何在Core Data中仅保存mm/dd/yyyy日期而不是从UIDatePicker保存的小时呢?

或者您是否考虑过其他解决方案?


3
你需要从日期中移除时间。https://dev59.com/F2855IYBdhLWcg3wuGwM - Lou Franco
你还需要时间信息吗?如果不需要,当设置核心数据对象的时间时,可以将时间组件设置为0。如果需要,您必须添加另一个属性,该属性使用没有时间组件的NSDate或yyyymmdd字符串。 - Matthias Bauch
2个回答

6
使用比较器块对日期进行排序,将日期转换为格式为yyyyMMdd的字符串。
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyyMMdd"];
NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO comparator:^NSComparisonResult(NSDate *obj1, NSDate *obj2) {
    return [[formatter stringFromDate:obj1] compare:[formatter stringFromDate:obj2]];
}];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

0

CoreData 支持 NSDate,但它总是包含小时。我唯一能想到的方法是创建一个自定义的只读属性,其中包含没有小时的时间戳,然后为该属性创建排序描述符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接