关于Core data
设计用来与MVC设计模式协同工作的
返回的数据结构由模式(schema)或者受控数据模型中定义的
Core Data 栈
由以下内容组成
- 受控对象模型
- 持久化存储调度器
- 持久哈存储和存储文件
- 受控对象上下文
图如下
受控对象模型(managed object model)
也叫对象模型,定义了应用中的数据结构。受控对象模型存储在文件中,拓展名为 .xcdatamodeld可用Core Data模型编辑器编辑
设置 entity
- attribute
- relationship
- fetch property
接下来使用Xcode自带工具生成model
持久化存储调度器
通过受控对象模型可以创建持久化调度器,对象模型定义的实体和关系会受调度器管理
持久化调度器创建好后,基本是一个自动的过程
如果一个应用拥有的存储文件多于一个,调度器的用处就会凸现出来。他将管理底层的存储,提供一个单一的受控对象上下文。
持久化存储和存储文件
生成NSPersistentStore 对象
受控对象上下文
Core Data 返回的是对象而不是值,受控对象上下文的工作是管理Core Data创建并返回的对象
如将持久化存储的数据显示出来我们要这么做
- 创建实体描述对象 NSEntityDescription
- 为需要的实体新建一个请求
- 执行获取请求
- 便利返回的对象
Core Data的并发性
IOS5 加入了新功能,让受控上下文可以在初始化时选择不同的并发类型。
以前受控对象上下文对象只能在创建上下文的那个线程中使用。现在可用以下三种并发类型初始化
NSConfinementConcurrencyType //和以前一样
NSMainQueueConcurrencyType
NSPrivateQueueConcurrencyType
NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 会再一个GCD分发队列内进行操作,使用基于队列的上下文时,该上下文创建的对象只在创建他的队列内有效,如果使用主队列上下文,就只能在主分发队列中与这个上下文打交道
手动创建Core Data 栈
- 创建受控对象模型,新建Data Model,添加entity,添加属性和关系,关系(Relationships)是强关系,相互知道,派送属性(Fetched Properties) 是弱关系
- 创建持久化调度器
- 为调度器添加一个持久化对象存储
- 创建新的受控对象上下文,并设置存储调度器
与Core Data 互动
添加新对象
获取对象并修改数据
删除对象
撤销、重做、回滚和复位(这里操作的都是用户的动作)
用户的动作分为三类
用户触发的控件事件(按钮、滑动条、步进器)
触摸事件(touchesBegin、UIGesureRecognizer)
晃动事件(motionBegan)
CoreDateDemo,界面如下
<span style="font-size:12px;">@interface CoreDataManager : NSObject
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
+(id)sharedCoreDataManager;
- (BOOL)saveContext;
- (void)undo;
- (void)redo;
- (void)rollback;
- (void)reset;</span>
定制的某一个Model继承了CoreDataManager,具体定制了获取、插入、移除的操作
在.m中把需要修改的字段定义成宏参考资料: IOS5核心框架
#define Entity_Name @"TimeEntity"
#define Entity_Key @"number"
@interface TimeEntityManager : CoreDataManager
-(NSArray *)timeEntities;
-(NSArray *)timeEntitiesWithTitle:(NSString *)title;
-(TimeEntity *)makeEntityWithTime:(NSString *)time;
-(BOOL)removeTimeEnities:(NSArray *)timeEArray;
-(BOOL)removeALLTimeEnities;
Demo 下载地址:https://github.com/caigee/iosdev_sample
下的CoreDataDemo
厚吾(http://blog.csdn.net/mangosnow)
本文遵循“署名-非商业用途-保持一致”创作公用协议