FetchedResultsController-03-CoreData相关

//
//  EditViewController.m
//  03_FetchedResultsController
//
//  Created by JayWon on 15/10/13.
//  Copyright (c) 2015年 JayWon. All rights reserved.
//

#import "EditViewController.h"
#import "Student.h"
#import "DBManager.h"

@interface EditViewController ()
{
    __weak IBOutlet UITextField *nameTF;
    __weak IBOutlet UITextField *studNoTF;
    __weak IBOutlet UISegmentedControl *lessonSgmtCtrl;
}

@end

@implementation EditViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(saveAction)];
}

-(void)saveAction
{
        //(1)判断输入数据的有效性
    if (nameTF.text.length == 0 || studNoTF.text.length == 0) {

        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"警告" message:@"信息不完整" preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *action = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:nil];
        [alert addAction:action];
        [self presentViewController:alert animated:YES completion:nil];

        return;}

        //(2)创建Student对象,把Student添加到context上。
    Student *stud = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:[DBManager shareManager].managedObjectContext];
    stud.name = nameTF.text;
    stud.no = studNoTF.text;

    stud.lesson = [lessonSgmtCtrl titleForSegmentAtIndex:lessonSgmtCtrl.selectedSegmentIndex];

        //(3)同步到数据库
    [[DBManager shareManager] saveContext];

        //(4)回到学生信息列表界面
    [self.navigationController popViewControllerAnimated:YES];
}

//回收键盘
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [self.view endEditing:YES];
}

@end
//
//  ListTableViewController.m
//  03_FetchedResultsController
//
//  Created by JayWon on 15/10/13.
//  Copyright (c) 2015年 JayWon. All rights reserved.
//

#import "ListTableViewController.h"
#import "DBManager.h"
#import "Student.h"

@interface ListTableViewController () <NSFetchedResultsControllerDelegate>
@end

@implementation ListTableViewController {

    NSFetchedResultsController *_fetchedCtrl;
}

- (void)viewDidLoad {
    [super viewDidLoad];

   [self configFetchedCtroller];
}

- (void)configFetchedCtroller {

    if (_fetchedCtrl) {
        return;
    }

    //1.设置查询对象
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];

    //2.设置tableView中每条数据的显示规则,升序或者降序,可以依据数据库中某一个字段来作为排序标准。
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"no" ascending:YES];

    request.sortDescriptors = @[sort];

    //3.fetchCtrl的作用是初始化tableView的数据源。
    //request的作用是表示显示数据库中哪一个表中的数据
    //sectionNameKeyPath参数的作用是表示以表中哪一个字段的内容进行分组显示
    _fetchedCtrl = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[DBManager shareManager].managedObjectContext sectionNameKeyPath:@"lesson" cacheName:nil];

    //5.设置代理来监听context中数据的变化
    _fetchedCtrl.delegate = self;

    //4.设置其开始工作,响应context的变化,并把此变化反馈到tableView上。
    [_fetchedCtrl performFetch:nil];
}

#pragma mark - Table view data source
/**
 *  1.返回section个数
 */
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return _fetchedCtrl.sections.count;
}
/**
 *  2.返回row个数
 */
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

     //获取到组对象
    id<NSFetchedResultsSectionInfo> result = _fetchedCtrl.sections[section];

    return [result numberOfObjects];
}
/**
 *  3.返回cell内容
 */
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"kListCellID"];

    Student *stud = [_fetchedCtrl objectAtIndexPath:indexPath];
    cell.textLabel.text = stud.name;
    cell.detailTextLabel.text = stud.no;
    return cell;
}

#pragma mark - section title
/**
 *  //1.返回组头视图的标题
 */
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    id<NSFetchedResultsSectionInfo> result = _fetchedCtrl.sections[section];
    return [result name];
}
/**
 *  2.侧边栏内容
 */
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    NSArray *sections = _fetchedCtrl.sections;
    NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:sections.count];
    for (id<NSFetchedResultsSectionInfo> result in sections) {

        [nameArray addObject:[result name]];
    }

    return nameArray;
}

#pragma mark - delete
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    return UITableViewCellEditingStyleDelete;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        //1.获取到Student对象
        Student *stu = [_fetchedCtrl objectAtIndexPath:indexPath];

        //2.从context上删除
        [[DBManager shareManager].managedObjectContext deleteObject:stu];
        //3.同步到数据库
        [[DBManager shareManager] saveContext];
    }
}

#pragma mark - NSFetchedResultsControllerDelegate
/**
 *  //1.数据变化时调用(对context做增删改移动后会调用)
 */
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(nullable NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(nullable NSIndexPath *)newIndexPath {

    switch (type) {
        case NSFetchedResultsChangeInsert:

            [self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];

            break;
        case NSFetchedResultsChangeDelete :
            [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        default:
            break;
    }

}
/**
 *  //2.当数据变化引起分区变化时调用
 */
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    switch (type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        default:
            break;
    }

}

/**
 *  //3.数据将要变化时调用
 */
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {

    [self.tableView beginUpdates];
}
/**
 *  //4.数据已经变化后调用
 */
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {

    [self.tableView endUpdates];
}

@end
//
//  DBManager.m
//  03_FetchedResultsController
//
//  Created by kangkathy on 15/12/4.
//  Copyright © 2015年 JayWon. All rights reserved.
//

#import "DBManager.h"

@implementation DBManager

+ (instancetype)shareManager {

    static DBManager *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[super allocWithZone:nil] init];
    });

    return instance;
}

-(id)copy {
    return self;
}

+(instancetype)allocWithZone:(struct _NSZone *)zone {
    return [self shareManager];
}

#pragma mark - Core Data stack

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

//返回沙盒路径下的Documents文件夹
- (NSURL *)applicationDocumentsDirectory {

    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

- (NSManagedObjectModel *)managedObjectModel {

    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    //程序包中的模型文件扩展名会自动变成momd。
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Student" withExtension:@"momd"];

    //对象模型是通过模型文件来构造的。
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    //PSC是根据模型文件创建的。
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Student.sqlite"];

    [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:nil];
    return _persistentStoreCoordinator;
}

- (NSManagedObjectContext *)managedObjectContext {

    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (!coordinator) {
        return nil;
    }
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

    //context与PSC对象关联起来,绑定PSC对象的目的是使Context和外部的存储文件联系起来。
    [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    return _managedObjectContext;
}

#pragma mark - Core Data Saving support

//对Context保存,即和外部的数据库文件同步。
- (void)saveContext {
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        //save操作表示同步。把context上的MO数据同步到数据库中。
        if ([managedObjectContext hasChanges])
        {
            [managedObjectContext save:nil];
        }
    }
}

@end
//
//  DBManager.h
//  03_FetchedResultsController
//
//  Created by kangkathy on 15/12/4.
//  Copyright © 2015年 JayWon. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface DBManager : NSObject

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

+ (instancetype)shareManager;

@end
时间: 2024-08-27 19:37:04

FetchedResultsController-03-CoreData相关的相关文章

Step by Step Do IOS Swift CoreData Simple Demo

简单介绍 这篇文章记录了在 IOS 中使用 Swift 操作 CoreData 的一些基础性内容,因为缺乏文档,基本上都是自行实验的结果.错漏不可避免,还请谅解. 部分内容借鉴了 Tim Roadley 的<Learning.Core.Data.for.iOS(2013.11)>, 这本书主要介绍 ObjC的 CoreData . 创建一个新 XCode 项目 创建一个新的 XCode 项目. 创建一个 Empty Application 填写项目相关信息,如设置项目名称为: SwiftCor

CoreData 多表 关联

本文转载至 http://www.jianshu.com/p/e9f3b5e0cd19 1.概念简介 coreData中存在复杂的数据关系时,一张表难以满足需求,此时就需要了解使用coreData多表的关联使用. 如 课程表 和 章节表 的关系:一个课程跟章节的对应关系是 一对多,单一个章节只能对应一个课程; 而课程表 与 讲师表 之间的关系:一个课程可以有多个讲师,一个讲师也可以讲多个课程,他们之间是多对多的关系 . 表之间就是靠这种相互约束的关系建立关联. 假设要删除一个课程,与此课程相关联

CoreData的使用-1

今天研究了下 CoreData 发现挺方便的,打算以后的项目中就用coredata 代替sqlite.现将使用方法整理如下: 1.新建一个工程,勾选CoreData,这样在生成的工程中,会自动帮你生成必须的代码,不用自己在创建,减少麻烦. 2.生成的coredata相关的代码在AppDelegate中,为了提高复用性,我单独建立一个类 ManagedObjectBase用来进行保存. ManagedObjectBase.h @interface ManagedObjectBase : NSObj

开源库 MagicalRecord 操作 CoreData

原文:http://www.cnblogs.com/YouXianMing/p/3597808.html MagicalRecord  https://github.com/magicalpanda/MagicalRecord 注意:  MagicalRecord 在 ARC 下运作,Core Data 是 ORM 方案,据说带来的麻烦比好处多,且 Core Data 建立的表没有主键,但对于对数据库没有性能要求,进行简单的数据操作完全够用,能简化无数的代码量. MagicalRecord In

使用开源库MagicalRecord操作CoreData

1. 将 MagicalRecord 文件夹拖入到工程文件中,引入 CoreData.frame 框架 2. 在 .pch 文件中引入头文件 CoreData+MagicalRecord.h 注:只能在.pch文件中引头文件,否则无法通过编译 3. 创建 Model.xcdatamodeld 文件,并创建一个 Student 的 ENTITIES,最后创建出 Student 类 4. 在 Appdelete.m 文件中写以下代码 以下是增删改查的基本操作,但注意一点,在做任何的数据库操作之前,请

SQL Server分区详解

一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区.SQL Server中数据是按水平方式分区,是多行数据映射到单个分区.已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体,简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率.需要注意的是单个索引或者表的分区必须位于一个数据库中. 在使用大量数据管理

MagicalRecord使用中的注意事项

使用CoreData [1] 使用CoreData [2] 使用CoreData [3] 使用CoreData [4] 使用MagicalRecord操作CoreData 将bundle中的CoreData相关文件复制到沙盒目录中并使用 复制这三个文件 然后用单例初始化 // // GlobalCoreData.h // YXMWeather // // Created by XianMingYou on 15/2/20. // Copyright (c) 2015年 XianMingYou.

使用多线程下载文件思路

01 开启多条线程,每条线程都只下载文件的一部分(通过设置请求头中的Range来实现) 02 创建一个和需要下载文件大小一致的文件,判断当前是那个线程,根据当前的线程来判断下载的数据应该写入到文件中的哪个位置.(假设开5条线程来下载10M的文件,那么线程1下载0-2M,线程2下载2-4M一次类推,当接收到服务器返回的数据之后应该先判断当前线程是哪个线程,假如当前线程是线程2,那么在写数据的时候就从文件的2M位置开始写入) 03 代码相关:使用NSFileHandle这个类的seekToFileO

S1java基础学习笔记

第一章  Java基础 程序目标:减轻现实生活中一类人的工作量,提高工作效率. 学员最终可以书写系统: 超市管理系统,POS机系统等 入库单 销售单 01.课程重点 五大重点: 01.分支(选择)结构 02.循环结构 03.数组 04.二重循环 05.带参方法 02.什么是计算机程序? 解析:就是为了完成某一项工作而执行的一系列有序指令的集合. 03.Java相关的技术有哪些? JavaSE(桌面应用开发)  JavaEE(Web开发) 老师,你教教我如何判定一个程序是桌面程序还是web程序?

2003DC迁移至2008!

朋友公司有台服务器 DC Windows 2003 系统 负责整个单位的日常办公 随着时间推移,老服务器越来越不行了.所以买了新服务器.打算把老服务器退休. 我们打算迁移. 确保 DC上的用户不能丢失! 再者,2003的DC还是能开启来的(这个是关键)! 所以打算给他平滑迁移到2008(新的服务器装Windows2008) 大致说下思路! 首先把08当额外域控制器,添加到现在运行的03系统中! 数据同步后,什么DNS,用户信息等~(切记,等数据同步后,不然你准备好新的简历把) 开始迁移5个角色.