6

我目前有一个类中有一个日期对象。这个日期对象既有时间又有日子。所有这些信息都通过NSFetchedResultsController加载到UITableViewCell中。我需要将日期排序,其中每个部分是日期而不是时间。我还需要每个部分按时间排序。这是我目前的_fetchedResultsController是什么样子:核心数据按日期排序FetchedResultsController分为

[self.managedObjectContext lock]; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription 
           entityForName:@"Entity" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
          initWithKey:@"due" ascending:YES]; 
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

[fetchRequest setFetchBatchSize:20]; 

NSFetchedResultsController *theFetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
            managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil 
               cacheName:@"Root"]; 
theFetchedResultsController.delegate = sender; 
[self.managedObjectContext unlock]; 
return theFetchedResultsController; 

我需要排序的属性是Entity.due属性。

+0

你能够获取NSDate对象并将它们显示在你的UITableView?换句话说,问题就是显示和排序? – Jamie 2012-07-11 03:42:54

+0

@Jamie这只是一个问题按日期排序(忽略小时,分钟和秒) – CoreCode 2012-07-11 05:34:40

回答

8

您可能想查看名为“DateSectionTitles”的核心数据示例以获取更多信息,我将重点介绍它的基础知识。

要根据日期有部分,您需要首先按照规范化(或简化)的日期进行排序。请尝试以下操作:

在核心数据模型编辑器中为您的实体添加临时属性。确保它的类型是NSDate,并检查它的瞬态属性。通过添加属性作为强大的NSDate来更新您的NSManagedObject类文件。称它为“simplifiedDate”。还要将另一个属性添加到.h文件中,将其称为“primitiveSimplifiedDate”。让它变得强大。

在.m中为simplifiedDate和primitiveSimplifiedDate使用@dynamic。这个瞬态属性应该使用返回已经规范化为午夜的NSDate。这个级别设置一切,并允许您建立章节。我用代码一起的台词:

-(NSDate *)simplifiedDate{ 
    // Create and cache the section identifier on demand. 

    [self willAccessValueForKey:@"simplifiedDate"]; 
    NSDate *tmp = [self primitiveSimplifiedDate]; 
    [self didAccessValueForKey:@"simplifiedDate"]; 

    if (!tmp) { 
     tmp=[self simplifiedDateForDate: [self due]]; 
     [self setPrimitiveSimplifiedDate: tmp]; 
    } 

    return tmp; 
} 


-(NSDate *)simplifiedDateForDate:(NSDate *)date { 

    if (!date) { 
     return nil; 
    } 

    static NSCalendar *gregorian = nil; 

    gregorian=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *newDateComponents=[gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit| NSDayCalendarUnit) fromDate:date]; 

    return [gregorian dateFromComponents:newDateComponents]; 
} 

如果你需要的话,这也可能是计算和实际的日期设定存储的实际属性。

接下来,您将有两个排序描述符。第一个排序描述符将是上述瞬态属性“simplifiedDate”。第二个属性将是“到期”属性。只要NSFetchedResultsController在下一步中正确设置,“simplifiedDate”将根据该部分对所有内容进行排序。

最后,您需要在alloc/init NSFetchedResultsController时提供部分键名。在这种情况下,它将是“simplifiedDate”。像这样:

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
           managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"simplifiedDate"cacheName:@"Root"]; 

希望这会有所帮助。

t

+0

所以我会添加一个新的属性到子类并添加此方法?我将如何对财产和新方法一起工作?该属性的属性应该是什么样子(强,弱,非原子,NSDate,动态等)。谢谢 – CoreCode 2012-07-11 05:54:28

+0

看到更新的回复 – timthetoolman 2012-07-11 06:15:31

+0

谢谢,当我有机会,我会试试看它是否有效 – CoreCode 2012-07-11 07:53:10