iOS应用开发之CoreData[转]
我目前的理解,CoreData相当于一个综合的数据库管理库,它支持sqlite,二进制存储文件两种形式的数据存储。而CoreData提供了存储管理,包括查询、插入、
删除、更新、回滚、会话管理、锁管理等一系列数据库操作。另外,开发者还可以在xcode中使用 .xcdatamodel 扩展名的文件,以图形化的形式编辑数据模型,这里包括了
Entities、Properties、Attributes、Relationships四个概念,这里跟关系型数据库有很大的相似点。
下面来看一下CoreData的框架。

一次来了解一下 PersistentStore、DataModel、PersistentStoreCoordinator、ManagedObjects、ManagedObjectsContext、FetchRequest 这些概念。
PersistentStore
这个是数据真正存储的地方,CodeData提供了两种存储的选择,分别是sqlite和二进制文件。PersistentStore本身并不是objc类,仅仅是数据存储。
DataModel
对应的objc类为 NSManagedObjectModel,一个典型的应用如:
- /**
- Returns the managed object model for the application.
- If the model doesn't already exist, it is created by merging all of the models
- found in the application bundle.
- */
- - (NSManagedObjectModel *)managedObjectModel {
- if (managedObjectModel != nil) {
- return managedObjectModel;
- }
- managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
- return managedObjectModel;
- }
这里用了iPhone开发中典型的laze loading,而
- managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
中的nil表示连接项目中所有的 .xcodemodel 文件为一个datamodel,这是一个非常好的方法,把多个entity放在各自的xcodemodel文件中分开管理,然后用这个函数连接起来生成一个datamodel,这样就可以对应一个persistentStore。
PersistentStoreCoordinator
对应的objc类为NSPersistentStoreCoordinator,这个类用来控制对PersistentStore的访问。PersistentStoreCoordinator提供了一些列的高级调用供其他类来使用,对PersistentStore进行读和写。下面看一段典型的代码:
- /**
- Returns the persistent store coordinator for the application.
- If the coordinator doesn't already exist, it is created and the application's store
- added to it.
- */
- - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
- if (persistentStoreCoordinator != nil) {
- return persistentStoreCoordinator;
- }
- NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
- stringByAppendingPathComponent: @"CoreData.sqlite"]];
- NSError *error;
- persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
- initWithManagedObjectModel: [self managedObjectModel]];
- if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
- configuration:nil URL:storeUrl options:nil error:&error]) {
- // Handle error
- }
- return persistentStoreCoordinator;
- }
这里默认存储形式为sqlite,并且存储文件为CoreData.sqlite,这段代码比较简单,创建了persistentStoreCoordinator实例。
ManagedObjects
对应的类为NSManagedObject。上面的CoreData框架图中有Entities,Entity定义了数据的结构,但他并不是数据,真正的数据实例是NSManagedObject类或他的子类。
NSManagedObject类支持Key-Value 编码(KVC),像NSDictionary差不多。NSManagedObject提供了valueForKey:和setValue:forKey:用来设置和查询的方法。另外他也提供了对关系操作的方法。
下面是几个典型的代码案例:
- NSDate *timeStamp = [managedObject valueForKey:@"timeStamp"];
- [managedObject setValue:[NSDate date] forKey:@"timeStamp"];
另外KVC也支持keypath,如有两个数据entity,一个是Employee,一个事Employer,Employee中有个属性石whereIWork,而这个属性用relationship连接到了对应的Employer,Employer中有个属性石name,这样要查询一个Employer的name,可以用keypath的形式,whereIWork.name。
- NSString *employerName = [managedObject valueForKeyPath:@"whereIWork.name"];
ManagedObjectsContext
对应的类为NSManagedObjectsContext。 这个类是一个用户对persistentStore操作的网关,他维护了用户创建或者加载的managed objects。他记录了用户对managed objects的所有改变,以便用来undo或redo,另外当用户要存储现在的managed objects到persistentstore时,只需调用managedObjectsContext的save方法就行了。
每个应用至少需要一个context,当然可以同时存在多个context,比如多线程时,如NSOperationQueue。context并不是线程安全的,因此在这种情况中用户要自己做好安全工作。
下面是一个简单应用实例。
- /**
- Returns the managed object context for the application.
- If the context doesn't already exist, it is created and bound to the persistent
- store coordinator for the application.
- */
- - (NSManagedObjectContext *) managedObjectContext {
- if (managedObjectContext != nil) {
- return managedObjectContext;
- }
- NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
- if (coordinator != nil) {
- managedObjectContext = [[NSManagedObjectContext alloc] init];
- [managedObjectContext setPersistentStoreCoordinator: coordinator];
- }
- return managedObjectContext;
- }
这个代码也比较简单,不做解释了。
FetchRequest(FetchRequestController)
这里重点讲FetchRequestController,其实用户打交道最多的就是这个控制器了。
from:http://www.lanou3g.com/blog/post-169.html
iOS应用开发之CoreData[转]的更多相关文章
- iOS开发之CoreData数据存储
iOS开发之CoreData数据存储 参考资料:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreD ...
- iOS多线程开发之GCD(中篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- iOS多线程开发之NSOperation - 快上车,没时间解释了!
一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...
- iOS游戏开发之UIDynamic
iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 ...
- iOS多线程开发之NSOperation
一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...
- iOS多线程开发之GCD(死锁篇)
上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...
- iOS多线程开发之GCD(中级篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- ios开发之CoreData使用
1.在工程中添加build Phases的Link Binary with Libraries下添加CoreData的库. 2.在当前工程中新建文件选择CoreData——>DataModel, ...
- iOS高效开发之Xcode应用插件
前言:本文非原创 文章摘自 www.cocoachina.com/industry/20130918/7022.html 古人云“工欲善其事必先利其器”,打造一个强大的开发环境,是立即提升自身战 ...
随机推荐
- kafka 高可靠
1.集群高可靠 ①搭建kafka集群(略) ②重点配置项(每个broker配置相同,只有broker.id不一样) broker.id=1 当前机器在集群中的唯一标识,和zookeeper的m ...
- poj2356 Find a multiple
/* POJ-2356 Find a multiple ----抽屉原理 Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total S ...
- Mysql--产品支持的平台
- cinder-backup详细介绍
首先介绍Snapshot snapshot可以为volume创建快照,快照中保存了volume当前的状态,此后可以通过snapshot回溯 主要采用了Copy On Write算法.进行快照时,不牵涉 ...
- bigdata
1.打开cygwin,启动hadoop,运行jps命令查看节点启动情况 2.切换到hadoop根目录,运行指令 echo "hello boy hei baby hello word hel ...
- sql查询语句常用例子
1.查找与jams在同一个单位的员工姓名.性别.部门和职称:select emp_no, emp_name, dept, title from employee where emp_name< ...
- 读《分布式一致性原理》JAVA客户端API操作2
创建节点 通过客户端API来创建一个数据节点,有一下两个接口: public String create(final String path, byte data[], List<ACL> ...
- vue组件之echarts报表
vue组件之echarts报表 将echarts报表封装成组件,动态传入数据,显示图表. 1.饼状图 父组件: <MPie :datas="piedata"></ ...
- C#获取外网IP、本机MAC地址及Ping的实现
原文 获取外网IP, C#获取本机的MAC地址,C#通过编程方式实现Ping 获取外网IP地址 思路是通过WebRequest连接一些网上提供IP查询服务的网站,下载到含有你的IP的网页,然后用正则表 ...
- python学习——练习题(10)
""" 题目:暂停一秒输出,并格式化当前时间. """ import sys import time def answer1(): &quo ...