我有一个相当特殊的问题。
我试图在TableView中显示来自CoreData的大量数据条目。在从iTunesU开发iOS7应用程序后,我使用了NSFetchedResultsController。初始化如下。
// Set up fetch results controller
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Session" inManagedObjectContext:[SessionManager sharedSessionManager].context];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Sort using the timeAtConnect property.
// Do not sort ascending to allow for the latest session to appear on top.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeAtConnect" ascending:NO];
[fetchRequest setSortDescriptors:@[sortDescriptor ]];
// Use the sectionIdentifier property to group into sections.
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[SessionManager sharedSessionManager].context sectionNameKeyPath:@"timeAtConnect" cacheName:@"Root"];
_fetchedResultsController.delegate = self;
我的CoreData集中目前有4个条目。会发生的是,其中一个最终成为其他一个的节头,见图。 (注意:每个条目的每个timeAtConnect
都是唯一的,对于每个条目都有一个部分是没有意义的,但没关系)
这里发生了什么?如有必要,我可以提供更多代码,但我认为这是最重要的。
感谢您的任何意见!
修改
我实际上想要每个条目有一个部分。我实际需要的是将每个时间戳(timeAtConnect
)分组到相应的日期。即2015-01-30 12:00和2015-01-30 13:00都会在2015-01-30之下结束,大概是通过使用类别,但我从来没有这样做。我认为这是识别错误的第一步。
我也想过;当我初始化NSFetchedResultsController和相应的NSSortDescriptor时,我排序timeAtConnect
降序。我在NSFetchedResultsController的初始化时没有用sectionNameKeyPath
指定。我相信这两个必须创建相同的排序。您如何指定该部分的降序? (我希望最新的条目显示在顶部)。
UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSInteger count = [[self.fetchedResultsController sections] count];
NSLog(@"Sections: %lu", (long) count);
return count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
NSInteger count = [sectionInfo numberOfObjects];
NSLog(@"Rows in section: %lu", (long)count);
return count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
/*
Use a default table view cell to display the event's title.
*/
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
Session *session = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"YYYY-MM-dd HH:mm";
// Same key as was used for sectioning and sorting
cell.textLabel.text = [formatter stringFromDate:session.timeAtConnect];
NSLog(@"Accessed cell at index.");
return cell;
}
-(NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> theSection = [[self.fetchedResultsController sections] objectAtIndex:section];
NSLog(@"Accessed title for header in section %lu", (long unsigned)section);
return theSection.name;
}
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
self.selectedSession = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSLog(@"Selected session %@", self.selectedSession.timeAtConnect);
[self performSegueWithIdentifier:@"moveToDetailedView" sender:self];
}
修改2
我刚注意到实际上并没有添加所有条目。一些条目消失了。从调试日志中我可以看到NSFetchedResultsController返回显示的部分数,即它与UITableView无关,而是与NSFetchedResultsController有关。
答案 0 :(得分:0)
我不知道您的应用的完整上下文,但这应解决您的直接问题,更改第二行以使sectionNameKeyPath为nil
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[SessionManager sharedSessionManager].context sectionNameKeyPath:nil cacheName:@"Root"];
答案 1 :(得分:0)
我怀疑您已经不必要地实施了委托方法
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//her you count your dataset and return the count.
}
如果您只有1个部分,则不应该实施该方法。