NSFetchedResultsController(查询结果控制器)

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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值