我有2个实体 - BlogEntry和BlogComments。
BlogEntry.comments与BlogComments之间存在“很多”关系
| BlogEntry |
-----------------
| subject |
| body |
| comments (rel)|
| BlogComments |
------------------
| commentText |
| blogEntry (rel)|
现在,我有一个tableview,我希望第一行是BlogEntry正文(文本),其余行是BlogComments。这是否可以使用NSFetchedResultsController?我可以分开这样的关系吗?如果是这样,有人能指出我正确的方向吗?
答案 0 :(得分:2)
使用分组UITableView
以及使用NSFetchedResultsController
和sectionNameKeyPath
的{{1}}:
NSPredicate
要确定节的标题,请使用fetchedResultsController的section属性:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"BlogComments"
inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
// Ensure we get a single blog entry and all it's associated comments
NSPredicate *predicate =
[NSPredicate predicateWithFormat:@"blogEntryID=%@", blogEntryID];
[fetchRequest setPredicate:predicate];
NSString *key = @"blogEntry.subject";
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:key
ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:keycacheName:nil];
aFetchedResultsController.delegate = self;
确定特定部分的行数:
- (NSString *)tableView:(UITableView *)tableView
titleForHeaderInSection:(NSInteger)section
{
if ([[fetchedResultsController sections] count] > section)
{
id <NSFetchedResultsSectionInfo> sectionInfo =
[[self.fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo name];
}
return nil;
}
最后,要获得tableview中的部分数量:
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
NSInteger numberofRows = 0;
if ([[fetchedResultsController sections] count] > 0)
{
id <NSFetchedResultsSectionInfo> sectionInfo =
[[fetchedResultsController sections] objectAtIndex:section];
numberofRows = [sectionInfo numberOfObjects];
}
return numberofRows;
}
结果是一个tableview,其中1个部分代表博客条目,所有它与博客评论相关联,作为tableView中的行。
答案 1 :(得分:0)
您可能不想使用NSFetchedResultsController
。它旨在轻松显示大量相同的托管对象。您有一个由两个托管对象组成的表。
(我在这里假设每个表格只显示一篇带有评论的博文。)
您需要做的是使用分段表。第一部分将显示博客文章的正文,第二部分将显示评论。如果在另一个视图中选择了帖子本身,则根本不需要提取。您只需了解帖子及其评论之间的关系即可。将注释放在一个数组中,然后根据需要对它们进行排序。
在numberOfSectionsInTableView:
方法返回2.在numberOfRowsInSection:
中有一个switch语句。如果该部分为零,则返回博客帖子的1。如果是两个,则返回注释数组的计数。在cellForRowAtIndexPath:
中重复切换以返回任一部分的正确单元格。