iOS CoreData NSFetchedResultsController部分和排序

我目前有有一个CoreData实体namedate的属性,我想创建一个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对数据进行了name ,但每个部分没有按date排序的条目,并且它的条目不是来自该name

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

更新:我一直无法做到这一点,所以我切换到结果类型字典和现在使用group by,我会留下这个问题,希望有人知道如何去做。


没有办法(我知道)将每个部分限制为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 ...

取决于你每个人拥有多少物品,这可能是不可行的。 如果有很多条目不会显示,我会建议将核心数据模型标准化。 例如:

在这里输入图像描述

然后你会显示一个人员列表。 但是,无论每个名称的对象数量如何,这种规范化可能是一个好主意。 获取比展示的物体更多的东西会让我感到腥味。


关于我的评论,这是一些代码片段

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];
链接地址: http://www.djcxy.com/p/6143.html

上一篇: iOS CoreData NSFetchedResultsController sections and sorting

下一篇: NSFetchedResultsController: sort descriptors and sections