2012-02-07 144 views
12

我想按日期先订购NSFetchRequest,然后按名称匹配当天的订单。 我用一个UIDatePicker来获得日期和使用核心数据按日期排序NSFetchRequest然后按字母顺序排序

[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存储在核心数据的日期,但也是小时。所以即使在同一天,由于时间不同,也不会在同一天按“姓名”排序。 那么如何在核心数据中只保存日期mm/dd/yyyy而不是从UIDatePicker开始保存?

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

+3

您需要从日期中删除时间。 http://stackoverflow.com/questions/4187478/truncate-nsdate-objective-c – 2012-02-07 20:00:58

+0

你需要什么时间信息?如果没有,则可以在设置核心数据对象的时间时将时间组件设置为0。如果您需要它,您必须添加另一个使用NSDate而不包含时间分量或yyyymmdd字符串的属性。 – 2012-02-07 20:02:55

回答

0

CoreData支持NSDate,但它将始终包含小时。我能想到的唯一的事情就是拥有一个自定义的只读属性,该属性具有不包含小时数的时间戳,然后为该属性创建排序描述符。

5

为日期排序使用比较器块将日期转换为格式为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];