对核心数据中的特定部分进行排序

时间:2011-12-19 10:19:00

标签: objective-c ios core-data

我正在使用NSFetchedResultsController来填充我的应用程序的tableView它是逐个部分(在这种情况下我的核心数据对象中的类别属性)我想手动重新排序该部分而不是字母顺序。

下面是我到目前为止所做的代码

- (NSFetchedResultsController *)fetchedResultsController {

if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"Media" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];

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

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                    managedObjectContext:_context sectionNameKeyPath:@"category" 
                                               cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

return _fetchedResultsController;    

}

提前致谢!

2 个答案:

答案 0 :(得分:2)

如果任务是提供部分的自定义顺序,那么你可以继承子类NSFetchedResultsController并实现

- (NSInteger)sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)sectionIndex;

,如果需要,

@property (nonatomic, readonly) NSArray *sectionIndexTitles;
- (NSString *)sectionIndexTitleForSectionName:(NSString *)sectionName;

答案 1 :(得分:2)

您可以添加名为MediaCategory的新实体:

  • 属性name
  • 属性rank
  • 与实体media
  • 的多对多关系Media

并将category属性替换为与MediaCategory的关系。

然后,您可以使用以下排序描述符对请求的结果进行排序:

fetchRequest.sortDescriptors =
[NSArray arrayWithObjects:
 [[NSSortDescriptor alloc] initWithKey:@"category.rank" ascending:NO],
 [[NSSortDescriptor alloc] initWithKey:@"category.name" ascending:NO], // required only if many categories have the same rank
 nil];

并提供@"category.name"作为结果控制器的sectionNameKeyPath