NSSortDescriptor应该对NSDates进行排序。

4

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

我在CoreData中存储了一个实体,其中有一个名为@"date"的NSDate类型的属性。 我试图对NSFetchRequest应用排序描述符,但似乎没有返回我所希望的结果。

我希望得到的结果只是按时间顺序排列日期,但实际上它们以它们添加到CoreData的顺序返回。

也许你可以提供一些指导吗?

参数'ascending'是否控制排序?

一些代码:

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

老实说,我改变了实体的名称。它不是数据...但这并不重要。 - esreli
什么是输入?什么是输出? - holex
输入?它们是NSDate类型的,符合属性类型。输出?一个NSDate数组。我不太确定如何回答你的问题。 - esreli
您的fetchRequest是正确的,是的,ascending控制排序顺序。您能否提供更多关于实体和结果方面的信息? - Bernd Rabe
1
我觉得sortedArrayUsingSelector:@selector(compare:)会更简单(得多)。 - Hot Licks
4个回答

3

这里有关于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];此外,函数参数需要一个 @selector() 而不是方法的名称吧?此外,你可以直接返回 [date1 compare:date2],而不必遍历所有可能的返回值。 - max_
当我清理这段代码时,确实没有考虑到这一点。 - Jaybit
这会枚举数组中的所有对象吗? - esreli
是的,调用 "sortedArrayUsingFunction:context:" 将枚举数组中的每个项目。如果数组不仅仅是日期,比如说它是一个NSDictionary数组,您可以修改dateSort函数以从字典中提取日期。 - Jaybit
我会使用代码块而不是函数。在Objective-C代码中,当像这样使用C函数时,它们可能会导致链接器错误,因此这种做法并不好。 - Richard J. Ross III
我添加了一个NSComparator块作为替代方案。 - Jaybit

3

对我来说,将排序例程(功能或块)分开看起来有些过度。 我通常只用您在代码中显示的排序描述符方法按日期属性对Core Data实体进行排序。 每次都完美运行。

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

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

我同意你的看法,这确实有些过头了。让我来回答你提出的答案:(a)xcdatamodel中的属性是日期类型。我没有创建对象实体.h或.m文件,因为我使用标准对象类型,这是一个基本模型。(b)我该如何检查这个?我不太明白你的意思。(c)没有混淆。 - esreli
(b): 搜索用于重新分配日期属性的文本,例如“.date =”或“setDate:”。 (a):这是您的解决方案。创建适当的NSManagedObject子类,然后您就可以开始了! - Mundi
(b) 这只是一个简单的交接。日期是我的自定义对象的属性,在创建后保持不变(只读),然后插入到nsmanagedobject中..没有重新分配。(a) 我认为这不是解决方案。这也是过度设计。它们是日期,可以正确保存并作为NSDates正确加载。子类化nsmanagedobject的附加好处是什么? - esreli
你刚刚给出了自己的答案!!日期“在创建后保持不变”。所以你的排序程序确实有效。 :-) 看来(b)确实是解决方案。通过将“ascending”改为相反的值来测试它。 - Mundi

0
在CoreData实体中添加时间戳 - 字符串类型字段
插入记录时使用creationDate。
  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];

-1

只需将样例中的 ""date 更改为 Date

就像在

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

转换为

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

它完美地运作了


3
“Date” 看起来不合乎逻辑。 - Saurabh Shukla
请再仔细阅读问题,"date"是一个NSEntity的名称。 - Urmil Setia

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