如何在核心数据关系上划分UITableView?

时间:2010-07-20 12:19:53

标签: ios iphone uitableview core-data

我有2个实体 - BlogEntry和BlogComments。

BlogEntry.comments与BlogComments之间存在“很多”关系

| BlogEntry     |
-----------------
| subject       |
| body          |
| comments (rel)|



| BlogComments   |
------------------
| commentText    |
| blogEntry (rel)|

现在,我有一个tableview,我希望第一行是BlogEntry正文(文本),其余行是BlogComments。这是否可以使用NSFetchedResultsController?我可以分开这样的关系吗?如果是这样,有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

使用分组UITableView以及使用NSFetchedResultsControllersectionNameKeyPath的{​​{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:中重复切换以返回任一部分的正确单元格。