iOS Core Data NSFetchedResultsController部分和排序

时间:2014-02-07 12:16:40

标签: ios iphone objective-c core-data nsfetchedresultscontroller

我目前有一个具有namedate属性的CoreData实体,我想创建一个NSFetchedResultsController,它返回按name排序的结果排序方式date降序(两个部分及其内容),如果可能,每个部分只有一个条目。我不想使用NSDictionaryResultType

假设我有以下条目:

Name | Date (year/month/day)
-----+----------------------
Anne | 2014/01/16
John | 2014/01/17
John | 2014/01/15
Nick | 2014/01/13
Nick | 2014/01/10

对于上述数据,我希望只获得以下结果:

Section | Entry Date
--------+-----------
John    | 2014/01/17
Anne    | 2014/01/16
Nick    | 2014/01/13

如何创建NSFetchedResultsController以仅获取数据并按上面列出的顺序?


截至目前,我有以下代码:

NSManagedObjectContext *moc = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:moc];
[fetchRequest setEntity:entity];

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"my predicate" argumentArray:...]];
[fetchRequest setPredicate:predicate];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:moc
                                          sectionNameKeyPath:@"name"
                                                   cacheName:nil];

上面的代码按name对数据进行了分段,但每个部分的条目都没有按date排序,并且其条目不是来自name

我想要的结果是显示由name排序的唯一date的表格,如帖子开头所示。

更新:我一直无法做到这一点,所以我切换到结果类型字典并暂时使用了group by,我会将问题打开,希望有人知道怎么做

2 个答案:

答案 0 :(得分:0)

以下是一些代码片段,就我的评论而言

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"EntityThingO"];

NSSortDescriptor *sortDescriptorDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
NSSortDescriptor *sortDescriptorName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
fetchRequest.sortDescriptors = @[sortDescriptorDate , sortDescriptorName];
[fetchRequest setFetchBatchSize:10];

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                managedObjectContext:context
                                                                  sectionNameKeyPath:@"date"
                                                                           cacheName:nil];

答案 1 :(得分:0)

我无法(我知道)将每个部分限制为NSFetchedResultsController中的一个结果。

但是,你可能不必这样做。您可能无法显示第一部分中没有的所有内容。

此外,您应该知道不应该使用除主要排序描述符中使用的密钥之外的任何其他密钥来对请求进行分区


如果您使用tableView,可以尝试这样的事情:

FRC创建

NSSortDescriptor *sdName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSSortDescriptor *sdDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
// sort by name, then sort by date
[fetchRequest setSortDescriptors:@[sdName, sdDate]];
[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:moc
                                      sectionNameKeyPath:@"name"
                                               cacheName:nil];

// fetch...

和tableViewDataSource:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    NSFetchedResultsController *fetchedResultsController = [self fetchedResultsController];
    return [fetchedResultsController.sections count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1; // only display one result for each section
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    NSFetchedResultsController *fetchedResultsController = [self fetchedResultsController];
    YourObject *object = [fetchedResultsController objectAtIndexPath:indexPath];
    ... configure cell ...

根据您每人拥有的物品数量,这可能不太可行。如果有很多条目你将无法显示我会建议标准化核心数据模型。 E.g:

enter image description here

然后您将显示人员列表。但是,无论每个名称的对象数量如何,这种规范化都可能是一个好主意。获取比显示的更多的对象闻起来有点可疑。