我想实现以下功能,你能不能帮助我。
我的应用中有核心数据库。在该数据库中,一个模型CourseEvents
包含超过150000个记录,每个记录包含大约12个字段。
每个UITableViewCell
的记录值。
但我不想在一次获取请求中获取所有记录。想要根据N
滚动来获取一些UITableView
个记录。
示例:
当表视图加载第一次想要获取200条记录时,每当用户滚动UITableView
需要获取下一条200条记录时,就像需要根据UITableview
的滚动从模型中获取数据一样
我怎样才能做到这一点。请帮助.....
答案 0 :(得分:3)
如果我正确理解你的问题,当你最初加载视图时,你只想获取200条记录,而在tableView Scroll上你想要获取下一条200,依此类推。您正在使用核心数据,然后在NSFetchedResultsController的帮助下更轻松地获取记录。只需将setFetchBatchSize
设置为您要获取的任何记录(在您的情况下,20也应该是好的)。网上有很多例子,还有很棒的苹果样本。以下是CoreDataBooks示例的链接。关于如何使用NSFetchedResultsController,这是很好的tutorial。最后Core Data Programming guide是你的帮助。这是关于如何使用NSFetchedResultController的示例代码
- (void)viewDidLoad {
[super viewDidLoad];
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
}
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"FailedBankInfo" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"details.closeDate" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:20];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext sectionNameKeyPath:nil
cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
id sectionInfo =
[[_fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
EntityName *entity = [_fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = entity.name; //just example
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@, %@",
entity.city, entity.state];
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Set up the cell...
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
答案 1 :(得分:1)
这个示例项目帮助我实现了我的解决方案。它也可能对你有帮助。 https://github.com/lukagabric/LargeDatasetSample