我目前的理解,CoreData相当于一个综合的数据库管理库,它支持sqlite,二进制存储文件两种形式的数据存储。而CoreData提供了存储管理,包括查询、插入、

删除、更新、回滚、会话管理、锁管理等一系列数据库操作。另外,开发者还可以在xcode中使用 .xcdatamodel 扩展名的文件,以图形化的形式编辑数据模型,这里包括了

Entities、Properties、Attributes、Relationships四个概念,这里跟关系型数据库有很大的相似点。

下面来看一下CoreData的框架。

一次来了解一下 PersistentStore、DataModel、PersistentStoreCoordinator、ManagedObjects、ManagedObjectsContext、FetchRequest 这些概念。

PersistentStore

这个是数据真正存储的地方,CodeData提供了两种存储的选择,分别是sqlite和二进制文件。PersistentStore本身并不是objc类,仅仅是数据存储。

DataModel

对应的objc类为 NSManagedObjectModel,一个典型的应用如:

  1. /**
  2. Returns the managed object model for the application.
  3. If the model doesn't already exist, it is created by merging all of the models
  4. found in the application bundle.
  5. */
  6. - (NSManagedObjectModel *)managedObjectModel {
  7. if (managedObjectModel != nil) {
  8. return managedObjectModel;
  9. }
  10. managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
  11. return managedObjectModel;
  12. }

这里用了iPhone开发中典型的laze loading,而

  1. managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];

中的nil表示连接项目中所有的 .xcodemodel 文件为一个datamodel,这是一个非常好的方法,把多个entity放在各自的xcodemodel文件中分开管理,然后用这个函数连接起来生成一个datamodel,这样就可以对应一个persistentStore。

PersistentStoreCoordinator

对应的objc类为NSPersistentStoreCoordinator,这个类用来控制对PersistentStore的访问。PersistentStoreCoordinator提供了一些列的高级调用供其他类来使用,对PersistentStore进行读和写。下面看一段典型的代码:

  1. /**
  2. Returns the persistent store coordinator for the application.
  3. If the coordinator doesn't already exist, it is created and the application's store
  4. added to it.
  5. */
  6. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
  7. if (persistentStoreCoordinator != nil) {
  8. return persistentStoreCoordinator;
  9. }
  10. NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
  11. stringByAppendingPathComponent: @"CoreData.sqlite"]];
  12. NSError *error;
  13. persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
  14. initWithManagedObjectModel: [self managedObjectModel]];
  15. if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
  16. configuration:nil URL:storeUrl options:nil error:&error]) {
  17. // Handle error
  18. }
  19. return persistentStoreCoordinator;
  20. }

这里默认存储形式为sqlite,并且存储文件为CoreData.sqlite,这段代码比较简单,创建了persistentStoreCoordinator实例。

ManagedObjects

对应的类为NSManagedObject。上面的CoreData框架图中有Entities,Entity定义了数据的结构,但他并不是数据,真正的数据实例是NSManagedObject类或他的子类。

NSManagedObject类支持Key-Value 编码(KVC),像NSDictionary差不多。NSManagedObject提供了valueForKey:和setValue:forKey:用来设置和查询的方法。另外他也提供了对关系操作的方法。

下面是几个典型的代码案例:

  1. NSDate *timeStamp = [managedObject valueForKey:@"timeStamp"];
  1. [managedObject setValue:[NSDate date] forKey:@"timeStamp"];

另外KVC也支持keypath,如有两个数据entity,一个是Employee,一个事Employer,Employee中有个属性石whereIWork,而这个属性用relationship连接到了对应的Employer,Employer中有个属性石name,这样要查询一个Employer的name,可以用keypath的形式,whereIWork.name

  1. NSString *employerName = [managedObject valueForKeyPath:@"whereIWork.name"];

ManagedObjectsContext

对应的类为NSManagedObjectsContext。 这个类是一个用户对persistentStore操作的网关,他维护了用户创建或者加载的managed objects。他记录了用户对managed objects的所有改变,以便用来undo或redo,另外当用户要存储现在的managed objects到persistentstore时,只需调用managedObjectsContext的save方法就行了。

每个应用至少需要一个context,当然可以同时存在多个context,比如多线程时,如NSOperationQueue。context并不是线程安全的,因此在这种情况中用户要自己做好安全工作。

下面是一个简单应用实例。

  1. /**
  2. Returns the managed object context for the application.
  3. If the context doesn't already exist, it is created and bound to the persistent
  4. store coordinator for the application.
  5. */
  6. - (NSManagedObjectContext *) managedObjectContext {
  7. if (managedObjectContext != nil) {
  8. return managedObjectContext;
  9. }
  10. NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
  11. if (coordinator != nil) {
  12. managedObjectContext = [[NSManagedObjectContext alloc] init];
  13. [managedObjectContext setPersistentStoreCoordinator: coordinator];
  14. }
  15. return managedObjectContext;
  16. }

这个代码也比较简单,不做解释了。

FetchRequest(FetchRequestController)

这里重点讲FetchRequestController,其实用户打交道最多的就是这个控制器了。

from:http://www.lanou3g.com/blog/post-169.html

iOS应用开发之CoreData[转]的更多相关文章

  1. iOS开发之CoreData数据存储

    iOS开发之CoreData数据存储 参考资料:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreD ...

  2. iOS多线程开发之GCD(中篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  3. iOS多线程开发之NSOperation - 快上车,没时间解释了!

    一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...

  4. iOS游戏开发之UIDynamic

    iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 ...

  5. iOS多线程开发之NSOperation

    一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...

  6. iOS多线程开发之GCD(死锁篇)

    上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...

  7. iOS多线程开发之GCD(中级篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  8. ios开发之CoreData使用

    1.在工程中添加build Phases的Link Binary with Libraries下添加CoreData的库. 2.在当前工程中新建文件选择CoreData——>DataModel, ...

  9. iOS高效开发之Xcode应用插件

    前言:本文非原创 文章摘自 www.cocoachina.com/industry/20130918/7022.html    古人云“工欲善其事必先利其器”,打造一个强大的开发环境,是立即提升自身战 ...

随机推荐

  1. 浅谈PHP面向对象编程(七、抽象类与接口)

    7.0 抽象类与接口 当定义一个类时,常常需要定义一些方法来描述该类的行为特征.但有时这些方法的实现方式是无法确定的,此时就可以使用抽象类和接口. 抽象类和接口用于提高程序的灵活性.抽象类是一种特殊的 ...

  2. Netty面试题

    1.BIO.NIO和AIO的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理.线程开销大. 伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源. N ...

  3. vector(实现存图)

    #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #i ...

  4. delphi三层架构

    我们的delphi程序很多是以前开发的,采用典型的CS架构,由程序直接连接数据库.现在需要改成在外网可以直接操作软件.先把数据库搬到了阿里云上,测试发现直接连数据库和VPN连接测试速度很慢,直连还容易 ...

  5. python+Django创建第一个项目

    1.首先搭建好环境 1.1 安装pyhton,Linux系统中,python是系统自带的所以就不用安装 1.2 安装Django框架 使用pip安装: pip install django 1.3 检 ...

  6. Superset安装

    Superset version 1.8.5     # Install superset   pip install cairocffi   pip install superset     yum ...

  7. 阿里云 mysql 远程登录权限

    [mysql中配置] 授权法: 1.登录到mysql中,为root进行远程访问的授权,执行下面的命令:  mysql> GRANT ALL PRIVILEGES ON *.* TO root@& ...

  8. 超出div宽度范围的文字进行省略号省略,在鼠标移上去以后显示完整的内容

    一.前言 当我们在固定的范围内显示内容时,我们是希望能够完整显示的,然而往往事与愿违,文本会超出我们给定的范围,这时候怎么办呢? 二.超出范围,对文本进行省略号隐藏 先上图 代码很简单 div{ wi ...

  9. POJ 3017 DP + 单调队列 + 堆

    题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...

  10. Io 异常: The Network Adapter could not establish the connection解决方案

    Io 异常: The Network Adapter could not establish the connection解决方案 2016年06月04日 13:30:21 阅读数:46589 Io ...