ListTableViewController.h
//ListTableViewController是UITableViewController子类
@interface ListTableViewController : UITableViewController
@end
ListTableViewController.m
#import "ListTableViewController.h"
#import "CoreDataManager.h"
#import "Student.h"
@interface ListTableViewController ()<NSFetchedResultsControllerDelegate>
{
NSFetchedResultsController *_resultsController;
}
@end
@implementation ListTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self createNSFetchedResultsController];
}
创建查询结果控制器
- (void)createFetchResultsController {
//创建查询请求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
//设置排序条件
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"number" ascending:YES];
request.sortDescriptors = @[sort];
//创建查询结果控制器
/*
Request 查询请求对象
managedObjectContext 所查询数据所在的context
sectionNameKeyPath 查询结果分组处理的依据
*/
_resultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[CoreDataManager shareManager].managedObjectContext sectionNameKeyPath:@"subject" cacheName:nil];
//设置代理
_resultsController.delegate = self;
//开始进行查询结果监视
[_resultsController performFetch:nil];
}
NSFetchedResultsControllerDelegate代理方法
#pragma mark - NSFetchedResultsControllerDelegate
//查询到的数据已经发生改变
- (void)controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject //发送改变的对像
atIndexPath:(NSIndexPath *)indexPath //发送改变数据所在的位置
forChangeType:(NSFetchedResultsChangeType)type //发送改变的类型
newIndexPath:(NSIndexPath *)newIndexPath //改变之后的数据位置
{
NSLog(@"%@", anObject);
if (type == NSFetchedResultsChangeInsert) {
//刷新表视图
//插入一行单元格
[self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
} else if (type == NSFetchedResultsChangeDelete) {
//删除一行单元格
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
//查询到的数据分组情况发生改变
- (void)controller:(NSFetchedResultsController *)controller
didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex
forChangeType:(NSFetchedResultsChangeType)type {
if (type == NSFetchedResultsChangeInsert) {
//刷新表视图
//插入一整个组
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
} else if (type == NSFetchedResultsChangeDelete) {
//删除一个分组
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
}
}
//查询到的内容将要改变
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
//表视图开始更新数据
[self.tableView beginUpdates];
}
//查询到的结果已经改变
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
//表视图完成数据更新
[self.tableView endUpdates];
}
组数,行数,单元格内容
#pragma mark - Table view data source
//组数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return _resultsController.sections.count;
}
//行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id<NSFetchedResultsSectionInfo> sec = _resultsController.sections[section];
return sec.numberOfObjects;
}
//单元格
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"kListCellID"];
id<NSFetchedResultsSectionInfo> sec = _resultsController.sections[indexPath.section];
Student *stu = sec.objects[indexPath.row];
cell.textLabel.text = stu.name;
cell.detailTextLabel.text = stu.number;
return cell;
}
组标题
#pragma mark - section title
//每个组的标题
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
id<NSFetchedResultsSectionInfo> sec = _resultsController.sections[section];
return sec.name;
}
//侧边栏索引栏标题
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
NSArray *array = _resultsController.sections;
NSMutableArray *nameArray = [[NSMutableArray alloc] init];
for (id<NSFetchedResultsSectionInfo> sec in array) {
[nameArray addObject:sec.name];
}
return [nameArray copy];
}
删除
#pragma mark - delete
//进入编辑状态返回的编辑模式
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewCellEditingStyleDelete;
}
//删除选中的单元格
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
id<NSFetchedResultsSectionInfo> sec = _resultsController.sections[indexPath.section];
Student *stu = sec.objects[indexPath.row];
if (editingStyle == UITableViewCellEditingStyleDelete) {
[[CoreDataManager shareManager].managedObjectContext deleteObject:stu];
[[CoreDataManager shareManager].managedObjectContext save:nil];
}
}
@interface NSFetchedResultsController : NSObject
@property (nullable, nonatomic, readonly) NSArray<id<NSFetchedResultsSectionInfo>> *sections;
@protocol NSFetchedResultsSectionInfo
//查询到的结果
@protocol NSFetchedResultsSectionInfo
//每个组的名字
@property (nonatomic, readonly) NSString *name;
//每个下标的标题
@property (nullable, nonatomic, readonly) NSString *indexTitle;
//每个分组的数据个数
@property (nonatomic, readonly) NSUInteger numberOfObjects;
//每个组的所有数据
@property (nullable, nonatomic, readonly) NSArray *objects;
@end