iOS CoreData NSFetchedResultsController部分和排序
我目前有有一个CoreData实体name
和date
的属性,我想创建一个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