CoreData 基础

  1. 新建工程勾选 "Use CoreData" 你会发现AppDelegate  文件多了一些属性及方法:
- (NSManagedObjectContext*)managedObjectContext

主要用于获取 “被管理的上下文”,将此方法放在AppDelegate 的原因也是显而易见的,那就是需要保持统 一, 既然使用CoreData 那就注意始终使用同一个被管理的上下文,简单的就是同一个对象。

NSManagedObjectContext:被管理的上下文

作用:操作上下文(增删改查)

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

NSPersistentStoreCoordinator : 持久化存储助理

作用:相当于数据库的连接器

- (NSManagedObjectModel *)managedObjectModel

NSManagedObjectModel: 被管理的数据模型

作用:管理实体、维护实体间的关系

通过代码的执行顺序我们发现,通过NSManagedObjectModel 得到 NSPersistentStoreCoordinator 通过 NSPersistentStoreCoordinator 得到 NSManagedObjectContext

NSManagedObjectModel ——>NSPersistentStoreCoordinator——>NSManagedObjectContext

2.   新建Person 实体 同时创建属性name surName

为Person实体生成modal类

3.    创建相关VC

这里就简单介绍关于Person 实体的 新增、修改、删除,所以这里需要再建两个类:PersonTVC(person 实体展示) PeronEditTVC(新增、编辑person)

那UI也很简单,storyboard快速创建相关视图即可,为了方便person 及personEdit是UITableViewController 子类

效果图大致如下:

     

4、实现相关代码

  • PersonTVC.h:
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
@interface PersonTVC : UITableViewController<NSFetchedResultsControllerDelegate>
//获取结果控制器
@property (strong ,nonatomic) NSFetchedResultsController *fetchedResultController;
//上下文对象
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, assign) BOOL beganUpdates;
@end

NSFetchedResultsController 为系统封装好的 “获取结果控制器”,主要是配合table使用方便,当然你也可以自己去fetch,拿到数组,显示。

NSManagedObjectContext 被管理的上下文,应与Appdelegate里面的上下文对象一致,如何获取就不多说了...

  • PersonTVC.m
#pragma mark - 初始化fetchResultController
- (void)setupFetchedResultsController
{
//    NSBatchUpdateReuqest
    // 1 - Decide what Entity you want
    NSString *entityName = @"Person"; // Put your entity name here
    
    // 2 - Request that Entity
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name"
                                                                                     ascending:YES
                                                                                      selector:@selector(localizedCaseInsensitiveCompare:)]];
    _fetchedResultController = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:_managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    _fetchedResultController.delegate = self;
    // 5 - Fetch it
    [self performFetch];
}

得到 “获取结果控制器对象”,并将结果按Name 字母排序,也可以不排#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return [[_fetchedResultController sections]count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return [[[_fetchedResultController sections]objectAtIndex:section]numberOfObjects];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"personCell" forIndexPath:indexPath];
    
    Person *person = [self.fetchedResultController objectAtIndexPath:indexPath];
    NSString *allName = [NSString stringWithFormat:@"%@ %@",person.name,person.surName];
    cell.textLabel.text = allName;
    return cell;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        
        [self.tableView beginUpdates]; // Avoid  NSInternalInconsistencyException
        
        // Delete the person object that was swiped
        Person *personToDelete = [_fetchedResultController objectAtIndexPath:indexPath];
        [self.managedObjectContext deleteObject:personToDelete];
        [self.managedObjectContext save:nil];
        
        // Delete the (now empty) row on the table
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [self performFetch];
        
        [self.tableView endUpdates];
    }
}

Table 的代理方法,基本上可以看出,数据源是从 _fetchedResultController 中获取。使用_fetchedResultController的好处还有 它实现了自动数据的自动监听回调,我们能够及时根据数据变化来刷新table。

  • _fetchedResultController 的代理方法实现
#pragma mark - NSFetchedResultsControllerDelegate
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView beginUpdates];
    _beganUpdates = YES;
}
- (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;
    }
}
- (void)controller:(NSFetchedResultsController *)controller
   didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath
     forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
    switch(type)
    {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
            
        case NSFetchedResultsChangeDelete:
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
            
        case NSFetchedResultsChangeUpdate:
            [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
            
        case NSFetchedResultsChangeMove:
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    if (_beganUpdates) [self.tableView endUpdates];
}

可以看出这些代理方法能够很好的监听每个状态的变化,这样我们不必自己去实现监听。

  • PersonEditTVC

    该类主要用于新增,和修改person 对象,所以定义好type 来区分,该类的重点在save 方法的实现

- (IBAction)saveEditPersonClick:(id)sender {
    if(_personType == personTypeAdd)
    {
        Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:_managedObjectContext];
        if(_nameField.text.length>0&&_surNameField.text.length>0)
        {
            person.name = _nameField.text;
            person.surName = _surNameField.text;
        }
    }
    else if(_personType == personTypeEidt)
    {
        _currentPerson.name = _nameField.text;
        _currentPerson.surName = _surNameField.text;
    }
    
    [_managedObjectContext save:nil];
    [self.navigationController popViewControllerAnimated:YES];
}

可以看到新增或修改的对象都要是当前上下文_managedObjectContext 的对象,修改或添加后只需调用_managedObjectContext save 即可。当上下文数据有变化时在PersonTVC 中 NSFetctchedResultsControllerDelegete 方法就会执行。实现table 实时刷新。

同样这里实现了新增,修改,同样还有删除。为了方便,直接在PersonTVC 上实现左滑删除。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        
        [self.tableView beginUpdates]; // Avoid  NSInternalInconsistencyException
        
        // Delete the person object that was swiped
        Person *personToDelete = [_fetchedResultController objectAtIndexPath:indexPath];
        [self.managedObjectContext deleteObject:personToDelete];
        [self.managedObjectContext save:nil];
        
        // Delete the (now empty) row on the table
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [self performFetch];
        
        [self.tableView endUpdates];
    }
}

可以看出,同样也是拿到_fetchedResutController 中的具体对象,然后在上下文_managedObjectContext 中删除。

——————————————————————————

这里简单介绍了CoreData的基本使用方法,有人说用sqlite+FMDB 效果好,也有人支持用CoreData,下篇介绍coreData 与 sqlite 的差异及性能对比。

时间: 2024-10-14 18:37:22

CoreData 基础的相关文章

CoreData基础

CoreData用于做数据持久化,适合大数据量的存储和查询 CoreData不是数据库 CoreData可以使用数据库 ,XML等方式来存储数据 CoreData使用面向对象的方式操作数据 CoreData操作数据无需编写SQL语句 使用时 需要导入CoreData框架 //---------------------------------------------------------- NSManagedObjectContext 负责应用和数据库之间的交互 NSPersistentStor

coredata基础用法1(附coredata demo)

一.概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型 在Mac OS X 10.5Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式 3.好处:能够合理管理内存,避免使用sql的麻烦,高效 4.构成: (1)NSManagedObjectContext(被管理的数据上下文) 操作实际内容(操作持久层) 作用:插入数据,查询数据,删除数据 (

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

CoreData的基础知识

1.CoreData的专业术语   NSManagerModel   被管理的数据模型   NSManngerObject   被管理的数据对象   NSPersistentStoreCoordinator   持久化存储助理   NSManagerContext   被管理的数据的上下文   NSEntityDspcipition   实体结构(相当于表格结构)   NSFetchRequest   获得数据的请求   NSPredicate   谓词(筛选数据)   后缀为.xcdatamo

用CoreData存储数据(一)基础

CoreData优点:能够合理管理内存,避免使用sql的麻烦,高效 Managed Object Context (管理数据内容) 操作实际内容(操作持久层) 作用:插入数据,查询数据,删除数据 , 管理对象,上下文,持久性存储模型对象 Managed Object Model (管理数据模型) 数据库所有表格或数据结构,包含各实体的定义信息 作用:添加实体的属性,建立属性之间的关系 Persistent Store Coordinator(持久性数据协调器) 相当于数据库的连接器 作用:设置数

iOS面试必备-iOS基础知识

近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内存管理机制:使用引用计数管理,分为ARC和MRC,MRC需要程序员自己管理内存,ARC则不需要.但是并不是 所有对象在ARC环境下均不需要管理内存,子线程和循环引用并不是这样.与retain配对使用的是release,retain代表引用计 数+1,release代表引用计数-1,当引用计数减为0时

CoreData

CoreData 是什么? Core Data 是一个模型层的技术.Core Data 帮助你建立代表程序状态的模型层.Core Data 也是一种持久化技术,它能将模型对象的状态持久化到磁盘,但它最重要的特点是:Core Data 不仅是一个加载.保存数据的框架,它还能和内存中的数据很好的共事 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据

ios面试基础

1.#import和#include的区别 @class? @class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文 件中还是需要使用#import 而#import比起#include的好处就是不会引起交叉编译 2. readwrite,readonly,assign,retain,copy,nonatomic 属性的作用 @property是 一个属性访问声明,扩号内支持以下几个属性: 1,getter=getName,setter=setName,设置setter与 get

iOS开发——数据持久化OC篇&amp;(七)CoreData高级常识

CoreData高级常识 关于CoreData貌似实际开发中很少用到,基本上是个有九个公司不会使用它,因为都说是性能不好,但是作为一个程序员,了解及其使用时必须了, 下面是我从一位大神那里搬过来的一下Core详细介绍,相信以后总有一天会帮我解决不少学习CoreData中的问题! 一.技术概览 1. Core Data 功能初窥 对于处理诸如对象生命周期管理.对象图管理等日常任务,Core Data框架提供了广泛且自动化的解决方案.它有以下特性. (注:对象图-Object graph的解释:在面