【问题标题】:NSSortDescriptor should sort NSDatesNSSortDescriptor 应该对 NSDates 进行排序
【发布时间】:2012-08-22 03:38:07
【问题描述】:

看起来 NSSortDescriptor 应该是一个相当容易使用的类。

我在 CoreData 中存储了一个具有 NSDate 类型属性的实体,该属性适当地命名为 @"date"。我正在尝试将排序描述符应用于 NSFetchRequest 并且它似乎没有返回我希望的结果。

我希望的结果是简单地按时间顺序排列日期,而是按照它们添加到 CoreData 的顺序返回它们。

也许您可以提供指导?

参数“升序”控制排序吗?

一些代码:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Data" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entityDesc];

[fetchRequest setFetchBatchSize:10];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];    

[fetchRequest setSortDescriptors:sortDescriptors];

NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

【问题讨论】:

  • 老实说,我更改了实体的名称。这不是数据……但这不是重要的部分
  • 输入是什么?输出是什么?
  • 输入?它们是 NSDates,对属性类型是正确的。输出? NSDates 数组。我不确定如何回答您的问题
  • 您的 fetchRequest 是正确的,是的,升序控制了排序顺序。您能否提供有关实体和结果的更多信息?
  • 在我看来sortedArrayUsingSelector:@selector(compare:) 会(更)简单。

标签: objective-c sorting core-data nsfetchrequest nssortdescriptor


【解决方案1】:

这里有更多关于NSSortDescriptors的信息

或者,如果您想在获得 coreDate 日期后对日期数组进行排序:

//This is how I sort an array of dates.
NSArray *sortedDateArray = [dateArray sortedArrayUsingFunction:dateSort context:NULL];

// This is a sorting function
int dateSort(id date1, id date2, void *context)
{    
    return [date1 compare:date2];
}

这是直接来自苹果的用于排序整数的代码(只需修改为排序日期):NSComparator

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {

    if ([obj1 integerValue] > [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedDescending;
    }

    if ([obj1 integerValue] < [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];

【讨论】:

  • [date1 date2] ?我想你的意思是[date1 compare:date2];。另外,Function 参数肯定需要@selector() 而不是方法的名称吗?此外,您可以只返回[date1 compare:date2],而不是遍历所有可能的返回值。
  • True 在我为此剥离代码时并没有考虑到这一点。
  • 这个枚举数组中的所有对象?
  • 是的,调用“sortedArrayUsingFunction: context:”将枚举数组中的每个项目。如果数组不仅仅是日期,假设它是一个 NSDictionarys 数组,您可以修改 dateSort 函数以从字典中提取日期。
  • 我只会使用块,而不是函数。 C-Function 在 Objective-C 代码中像这样使用是个坏主意,因为它们会导致链接器错误。
【解决方案2】:

对我来说,单独的排序例程(函数或块)看起来有点矫枉过正。我经常使用您在代码中显示的排序描述符方法按日期属性对核心数据实体进行排序。它每次都能完美运行。

显然,肯定还有其他错误。

  • 检查类型是否在您的托管对象模型编辑器和类文件中正确设置(Data.h,在您的情况下)。
  • 另外,请检查您是否没有在操作此属性,以便随后创建创建顺序。
  • 另外,请确保您没有将此属性与NSDate 类型的另一个属性混淆。

【讨论】:

  • 我同意你的观点,这太过分了。让我解决您提出的答案:(a)xcdatamodel 中的属性是日期类型。我没有创建对象实体 .h 或 .m 因为我使用标准对象类型,它是一个基本模型。 (b) 我该如何检查这个?我不太明白你的意思。 (c)没有混淆
  • (b):搜索用于重新分配日期属性的文本,例如 ".date =""setDate:"。 (a):这是您的解决方案。创建正确的 NSManagedObject 子类,一切顺利!
  • (b)这真的是一个简单的交接。日期是我的自定义对象的属性,它在创建后保持不变(只读),然后插入到 nsmanagedobject.. 没有重新分配。 (a) 我认为这不是解决方案。这也是矫枉过正。它们是日期,它们正确保存并正确加载为 NSDates。继承 nsmanagedobject 的额外好处是什么?
  • 你刚刚给出了自己的答案!!日期“在创建后保持不变”。所以你的排序程序毕竟是有效的。 :-) 看来(b)确实是解决方案。通过将ascending 更改为相反的值来测试它。
【解决方案3】:

只需将示例“日期更改为日期”

喜欢

NSSortDescriptor *sortDescriptor = 
  [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];

改成

NSSortDescriptor *sortDescriptor = 
  [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:YES];

而且效果很好

【讨论】:

  • @"Date" 似乎不合逻辑。
  • 请再次阅读问题,“日期”是 NSEntity 的名称。
【解决方案4】:

添加时间戳 - CoreData 实体中的字符串类型字段

创建日期

在插入记录期间

  NSManagedObject *newCredetial = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];[newCredetial setValue:[self getDate] forKey:@"creationDate"];

日期函数

- (NSString *)getDate{
NSDate *date = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @"ddMMyyyyhhmmssss";

return [formatter stringFromDate:date];}

并在获取模块期间使用简短描述

NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest1 = [[NSFetchRequest alloc] initWithEntityName:@"Name"];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
[fetchRequest1 setSortDescriptors:@[sortDescriptor]];


arrNameInfo = [[managedObjectContext executeFetchRequest:fetchRequest1 error:nil] mutableCopy];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多