我目前有一个具有name
和date
属性的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,我会将问题打开,希望有人知道怎么做
答案 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:
然后您将显示人员列表。但是,无论每个名称的对象数量如何,这种规范化都可能是一个好主意。获取比显示的更多的对象闻起来有点可疑。