初步看了一下Core Data这个东西,本想早一点写这篇东西的,不过各种俗事缠身,又觉得自己对于Core Data机制了解的还不够深,动笔就慢了几天。不过今天盘点一下,觉得可以说一点东西出来就先说一点吧。

Core Data到底是个什么东西?是不是就是SQLite数据库?我觉得随着应用的越来越复杂,体现出来就是数据之间的关系越来越复杂,访问逻辑也变的更加的复杂臃肿,而相当多的应用都会用到数据的模型(或简单或复杂),所以苹果就单独弄了这样一个概念出现,并提供了辅助编辑/代码生成的工具,可以帮助减少不少工作量。至于说数据库,确实很多时候Core Data都是用数据库来做存储的支撑,但一来并非必须用数据库来存储,二来封装之后不需要任何SQL语句的,所以只能说数据库是支撑Core Data的技术之一,并非等价于Core Data。

Core Data里面自己定义了一些名词,什么NSManagedObject/NSManagedObjectContext/NSManagedObjectModel,这几个是最混淆的,其他的什么NSFetchRequest/NSEntityDescription还算好一点。(顺便吐槽一句,这种术语的翻译是最成问题的,不少书中还把这些翻成托管对象,托管对象上下文等等的,第一次看的时候你肯定一头雾水)

既然说到是Data,那么肯定是以数据为核心,同时封装对于数据的操作,形成一系列的辅助类。

NSManagedObject肯定是核心,这个可以看成一个一个的数据对象的实例,但封装后你很少直接访问这个类

NSManagedObjectContext是我们实际编程时打交道最多的,要访问一个数据对象,必须通过他的上下文

NSManagedObjectModel是我们整个应用程序里面的数据的抽象,包括了Entity,Attribute,Request等等

NSPresistentStoreCoordinator是对于数据存取的封装,封装了具体的加载/存储的实现细节

下面还是通过代码来看比较清晰,首先来看Xcode用于Core Data的辅助工具

编辑数据类型结束之后,Xcode会自动生成不少代码,其中每个Entity都会实现成一个类,Xcode会自动生成.h和.m文件

这个类实现的很简单,就是把属性列了一下,我们来看一下Event类的代码

@interface Event : NSManagedObject@property (nonatomic, retain) NSDate * creationDate;
@property (nonatomic, retain) NSNumber * latitude;
@property (nonatomic, retain) NSNumber * longitude;@end
    
@implementation Event@dynamic creationDate;
@dynamic latitude;
@dynamic longitude;@end

除了这几个类之外,应用的Delegate也有巨大的改变,ManagedObjectModel/ManagedObjectContext都在这里生成。

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

有了这些之后,我们来看数据的具体操作,假定我们要生成一个Event数据对象,并赋予当前的位置的值,然后存储起来

        Event *event = (Event*)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:self.managedObjectContext];CLLocationCoordinate2D coordinate = [_location coordinate];[event setCreationDate:[NSDate date]];[event setLatitude:[NSNumber numberWithDouble:coordinate.latitude]];[event setLongitude:[NSNumber numberWithDouble:coordinate.longitude]];NSError *error = nil;if (![self.managedObjectContext save:&error]) {NSLog(@"save new event error! errcode=%d", error.code);}

NSEntityDescription类是Entity的描述类,这个类有个全局的工厂方法,

+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context;

这个方法会生成一个数据对象并添加到managedObjectContext里面。

对于数据的存储,实用managedObjectContext的save方法,上面的代码生成了一个数据对象,加入了context,然后对数据对象进行了初始化,最后储存起来。

下面再看一段代码,这段代码用于查询所有的数据对象,并返回满足条件的对象数组

    NSFetchRequest *request = [[NSFetchRequest alloc] init];NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];[request setEntity:entity];NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];[request setSortDescriptors:sortDescriptors];[sortDescriptors release];[sortDescriptor release];NSError *error = nil;NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];if (mutableFetchResults) {self.eventArray = mutableFetchResults;[mutableFetchResults release];}[request release];

这也是非常常用的一个操作,这里先生成一个fetchRequest,然后告诉request在那个Entity里面查找,设置结束后运行managedObjectContext的executeFetchRequest方法,获得搜索到的所有对象(形成一个数组)

对数据对象的属性习惯上都是通过KVC来操作的,这里查询实用的是NSSortDescriptor,也可以使用NSPredicate这个类,使用fetchRequest的setPredicate方法设置一下即可。

对于数据的删除可以使用managedObjectContext的deleteObject方法,最后不要忘记调用save存储。

简单的数据操作差不多也就这几个内容了,增加,查询,删除,实现起来都很方便。

还有一个提一下,自动生成的数据对象的类(Event等等),里面是没有dealloc方法的,因为Core Data负责数据对象的整个生命周期,也就是说系统会自动的释放数据对象。

Core Data的使用相关推荐

  1. iOS Core Data

    基本概念 当前,各类应用开发中只要牵扯到数据库操作通常都会用到一个概念"对象关系映射(ORM)".例如在Java平台使用Hibernate,在.NET平台使用Entity Fram ...

  2. core data 学习笔记

    为什么80%的码农都做不了架构师?>>>    学习路线: Core Data Tutorial for iOS Core Data Utility Tutorial Core Da ...

  3. 《Core Data应用开发实践指南》一1.3 创建Grocery Dude项目

    本节书摘来自华章出版社<Core Data应用开发实践指南>一书中的第1章,第1.3节,作者 (美)Tim Roadley,更多章节内容可以访问云栖社区"华章计算机"公 ...

  4. iOS 数据持久化 -- Core Data (2)

    2019独角兽企业重金招聘Python工程师标准>>> 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里, ...

  5. 【转】多线程Core Data

    原文地址:http://www.cocoanetics.com/2012/07/multi-context-coredata/ Multi-Context CoreData When you star ...

  6. 一个完整的Core Data应用

    在这篇文章中,我们将建立一个小型但却全面支持Core Data的应用.应用允许你创建嵌套的列表:每个列表的item都可以有子列表,这将允许你创建非常深层次的item.为了让大家完整的了解发生了什么,我 ...

  7. [Cocoa]深入浅出Cocoa之Core Data(4)- 使用绑定

    深入浅出 Cocoa 之 Core Data(4)- 使用绑定 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创 ...

  8. Core Data 迁移与版本管理

    原文  http://chun.tips/blog/2014/11/28/core-data-ban-ben-qian-yi-jing-yan-zong-jie/ 主题 Core Data iOS开发 ...

  9. 使用core data

    要使用core data,首先要得到 NSManagedObjectContext 之前看过斯坦福2011年冬的公开课程视频,介绍过有2种方法得到 1.为通过UIManagedDocument 2.是 ...

  10. 关于Core Data的一些整理(一)

    关于Core Data的一些整理(一) 在Xcode7.2中只有Mast-Debug和Single View中可以勾选Use Core Data 如果勾选了Use Core Data,Xcode会自动 ...

最新文章

  1. CentOS Linux解决 Device eth0 does not seem to be present
  2. DBA工具——DMV——通过sys.dm_exec_procedure_stats查看存储过程执行信息
  3. PHP将英文数字转换为阿拉伯数字 
  4. 从搭建脚手架到在npm上发布react组件
  5. 【Matlab 控制】函数调用函数
  6. Struts2的文件目录
  7. fio 测试磁盘性能
  8. React开发(149):ant design控制是否必填
  9. 图灵奖得主Jeff Ullman:机器学习不是数据科学的全部!统计学也不是!
  10. oracle几个网络,ORACLE网络的几个重点概念
  11. backup ram不稳定 stm32_具备无线能力的STM32,如何让智能手表更加炙手可热?
  12. python机器学习案例系列教程——推荐系统
  13. nc(NetCat)命令
  14. Github视频教程-黄棒清-专题视频课程
  15. 移远BC95 NB-IoT模块串口发送数据到服务器
  16. 适合运动健身的蓝牙耳机推荐,六款适合运动健身的蓝牙耳机
  17. EMW3162 AT固件的使用【2】
  18. python和jsp哪个好学_Python,Java和JavaScript,学哪个编程语言好就业?
  19. NEFU ERP 企业资源计划[1] 详细知识点
  20. C盘容量不足,怎么增加c盘空间?看这5个方法

热门文章

  1. Android rom开发:最完整的截屏方案(支持全屏截屏+区域截屏)
  2. 【python 图像识别】图像识别从菜鸟走向大神系列1
  3. 出租车GPS数据分析的常规方法
  4. 利用SPSS做数据分析②之数据处理2
  5. 名字中间一条线怎么弄_网名怎么加横线啊 网名中间加一条横线
  6. gallery3d的源码分析——入口
  7. Shiro中principal和credential的区别
  8. MFC画带箭头的直线
  9. [置顶]乔布斯的斯坦福演讲(双语)
  10. 关于使用google map实现周边搜索的功能