文档章节

CoreData 基础

Carson6931
 Carson6931
发布于 2015/06/14 19:21
字数 1167
阅读 181
收藏 3
点赞 0
评论 0
  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 的差异及性能对比。

 

 

© 著作权归作者所有

共有 人打赏支持
Carson6931
粉丝 17
博文 9
码字总数 7471
作品 0
徐汇
程序员
Core Data 基本应用

操作coredata 处理4个场景的情况 Core Data 调试模式 简单的实际操作 建立CoreData可视化管理文件,生成对应的实体类 在appDelegate中建立CoreData对应的管理类对象 Document的路径 建立NSM...

云飞扬v5 ⋅ 2016/09/21 ⋅ 0

Swift实践:使用CoreData完成上班签到小工具

image.png 之前在前两篇里面实现了一个十分简陋的通讯录,而且都是通过系统默认的方式创建的CoreData。可是实际中哪里有那么好的事情嘛,要是忘记在创建工程的时候勾选了下面这个图怎么办? ...

非典型技术宅 ⋅ 2017/12/03 ⋅ 0

使用CoreData的轻量级自动数据迁移

使用IOS的CoreData进行存储很方便,CoreData已经帮我们做了很多基础的工作,一般情况下没必要自己操作数据库了。 在开发中修改了实体模型,可能会遇到schema incompatibility的错误,这是因为...

Megan_zhou ⋅ 2013/07/24 ⋅ 0

【逐渐提高】ios 代码库 集合类

系统基础库 Category/Util sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错~ BlocksKit 将Block风格带入UIKit和Founcation cocoa-helpers 一些Cocoa的扩展 2年前的工程 Coconu...

创意总监 ⋅ 2014/08/30 ⋅ 1

iPhone开发之CoreData(实战篇)

iPhone开发之CoreData(基础篇)中已经学习了CoreData的理论基础,是基于“Master-Detail Application”项目的代码分析,这一篇直接进入实战。 我们从“Empty Application”一个空项目开始,命...

jackyyang ⋅ 2012/07/29 ⋅ 0

CocoaTouch框架

iPhoneOS应用程序的基础CocoaTouch框架重用了许多Mac系统的成熟模式,但是它更多地专注于触摸的接口和优化。UIKit为您提供了在iPhoneOS上实现图形,事件驱动程序的基本工具,其建立在和MacOS...

hi-小疯疯 ⋅ 2015/11/30 ⋅ 0

Core Data 学习笔记(三)被管理对象

目录 Core Data 学习笔记(一)框架简介 Core Data 学习笔记(二)被管理对象模型 Core Data 学习笔记(三)被管理对象 Core Data 学习笔记 应用示例 Core Data 学习笔记 常用链接整理 五、被...

灰大羊 ⋅ 2015/07/29 ⋅ 0

Core Data 学习笔记(一)框架简介

目录 Core Data 学习笔记(一)框架简介 Core Data 学习笔记(二)被管理对象模型 Core Data 学习笔记(三)被管理对象 Core Data 学习笔记 应用示例 Core Data 学习笔记 常用链接整理 零、前...

灰大羊 ⋅ 2015/07/26 ⋅ 0

让你的project支持CoreData

创建工程的时候,如果是基于windows的,就有选择支持coreData,其它的project temple则没有支持coreData选项。如果项目进行到一半,需要加如coreData的支持如何办呢? 我们创建基于windows的...

长平狐 ⋅ 2012/08/13 ⋅ 0

coreData学习简要

今天开始学习使用coreData。 2种方法: 1.在新建工程时,勾选使用 coreData,那么在工程里面已经有工程同名的coreData模型(model),而且在appDelegate里面有了三个属性,还有相关方法。 @pro...

hahashiwo ⋅ 2014/12/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 54分钟前 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部