【问题标题】:Sort NSFetchRequest by date and then by alphabetical order按日期排序 NSFetchRequest,然后按字母顺序
【发布时间】:2023-03-14 01:34:02
【问题描述】:

我想先按日期订购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 中的日期和小时。所以即使是同一天,也不会因为当天的时间不同而按“姓名”排序。 那么如何在核心数据中只保存日期 mm/dd/yyyy 而不是来自UIDatePicker 的时间?

或者你有什么其他的解决办法吗?

【问题讨论】:

  • 您还需要时间信息吗?如果不是,您可以在设置核心数据对象的时间时将时间分量设置为 0。如果您需要它,您必须添加另一个属性,该属性使用不带时间组件的 NSDate 或 yyyymmdd 字符串。

标签: iphone sorting date uidatepicker nsfetchrequest


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2017-11-17
      相关资源
      最近更新 更多