NSSortDescriptor应该排序NSDates

时间:2012-08-27 16:08:32

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

看起来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];

4 个答案:

答案 0 :(得分: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];
}

这是直接来自apple的代码,用于排序整数(只需修改为排序日期):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;
}];

答案 1 :(得分:3)

单独的排序例程(函数或块)看起来对我来说太过分了。我通常只使用您在代码中显示的排序描述符方法按日期排序核心数据实体。它每次都很完美。

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

  • 检查您的托管对象模型编辑器中的类型是否已正确设置,以及在您的案例中是否为类文件(Data.h)。
  • 另外,检查您是否正在操作此属性,以便随后创建订单。
  • 另外,请确保您没有将此属性与NSDate类型的其他属性混淆。

答案 2 :(得分: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];

答案 3 :(得分:-1)

只需将“日期更改为日期

喜欢

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

更改为

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

它完美无缺