简介

Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的。简单地用下图描述下它的作用:

左边是关系模型,即数据库,数据库里面有张person表,person表里面有id、name、age三个字段,而且有2条记录;

右边是对象模型,可以看到,有2个OC对象;

利用Core Data框架,我们就可以轻松地将数据库里面的2条记录转换成2个OC对象,也可以轻松地将2个OC对象保存到数据库中,变成2条表记录,而且不用写一条SQL语句。

模型文件

  在Core Data,需要进行映射的对象称为实体(entity),而且需要使用Core Data的模型文件来描述app中的所有实体和实体属性。这里以Person(人)和Card(身份证)2个实体为例子,先看看实体属性和实体之间的关联关系:

Person实体中有:name(姓名)、age(年龄)、card(身份证)三个属性
Card实体中有:no(号码)、person(人)两个属性

接下来看看创建模型文件的过程:
1.选择模板

2.添加实体

3.添加Person的2个基本属性

4.添加Card的1个基本属性

5.建立Card和Person的关联关系

        

右图中的表示Card中有个Person类型的person属性,目的就是建立Card跟Person之间的一对一关联关系(建议补上这一项),在Person中加上Inverse属性后,你会发现Card中Inverse属性也自动补上了

了解NSManagedObject

1.通过Core Data从数据库取出的对象,默认情况下都是NSManagedObject对象
  

2.NSManagedObject的工作模式有点类似于NSDictionary对象,通过键-值对来存取所有的实体属性

1> setValue:forKey:存储属性值(属性名为key)

2> valueForKey:获取属性值(属性名为key)

CoreData中的核心对象


注:黑色表示类名,红色表示类里面的一个属性
开发步骤总结:
1.初始化NSManagedObjectModel对象,加载模型文件,读取app中的所有实体信息
2.初始化NSPersistentStoreCoordinator对象,添加持久化库(这里采取SQLite数据库)
3.初始化NSManagedObjectContext对象,拿到这个上下文对象操作实体,进行CRUD操作

代码实现

先添加CoreData.framework和导入主头文件<CoreData/CoreData.h>

1.搭建上下文环境

  1. // 从应用程序包中加载模型文件
  2. NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
  3. // 传入模型对象,初始化NSPersistentStoreCoordinator
  4. NSPersistentStoreCoordinator *psc = [[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model] autorelease];
  5. // 构建SQLite数据库文件的路径
  6. NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
  7. NSURL *url = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"person.data"]];
  8. // 添加持久化存储库,这里使用SQLite作为存储库
  9. NSError *error = nil;
  10. NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
  11. if (store == nil) { // 直接抛异常
  12. [NSException raise:@"添加数据库错误" format:@"%@", [error localizedDescription]];
  13. }
  14. // 初始化上下文,设置persistentStoreCoordinator属性
  15. NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
  16. context.persistentStoreCoordinator = psc;
  17. // 用完之后,记得要[context release];

2.添加数据到数据库

  1. // 传入上下文,创建一个Person实体对象
  2. NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
  3. // 设置Person的简单属性
  4. [person setValue:@"MJ" forKey:@"name"];
  5. [person setValue:[NSNumber numberWithInt:27] forKey:@"age"];
  6. // 传入上下文,创建一个Card实体对象
  7. NSManagedObject *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:context];
  8. [card setValue:@"4414241933432" forKey:@"no"];
  9. // 设置Person和Card之间的关联关系
  10. [person setValue:card forKey:@"card"];
  11. // 利用上下文对象,将数据同步到持久化存储库
  12. NSError *error = nil;
  13. BOOL success = [context save:&error];
  14. if (!success) {
  15. [NSException raise:@"访问数据库错误" format:@"%@", [error localizedDescription]];
  16. }
  17. // 如果是想做更新操作:只要在更改了实体对象的属性后调用[context save:&error],就能将更改的数据同步到数据库

3.从数据库中查询数据

  1. // 初始化一个查询请求
  2. NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
  3. // 设置要查询的实体
  4. request.entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
  5. // 设置排序(按照age降序)
  6. NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
  7. request.sortDescriptors = [NSArray arrayWithObject:sort];
  8. // 设置条件过滤(搜索name中包含字符串"Itcast-1"的记录,注意:设置条件过滤时,数据库SQL语句中的%要用*来代替,所以%Itcast-1%应该写成*Itcast-1*)
  9. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@", @"*Itcast-1*"];
  10. request.predicate = predicate;
  11. // 执行请求
  12. NSError *error = nil;
  13. NSArray *objs = [context executeFetchRequest:request error:&error];
  14. if (error) {
  15. [NSException raise:@"查询错误" format:@"%@", [error localizedDescription]];
  16. }
  17. // 遍历数据
  18. for (NSManagedObject *obj in objs) {
  19. NSLog(@"name=%@", [obj valueForKey:@"name"]
  20. }

注:Core Data不会根据实体中的关联关系立即获取相应的关联对象,比如通过Core Data取出Person实体时,并不会立即查询相关联的Card实体;当应用真的需要使用Card时,才会再次查询数据库,加载Card实体的信息。这个就是Core Data的延迟加载机制

4.删除数据库中的数据

  1. // 传入需要删除的实体对象
  2. [context deleteObject:managedObject];
  3. // 将结果同步到数据库
  4. NSError *error = nil;
  5. [context save:&error];
  6. if (error) {
  7. [NSException raise:@"删除错误" format:@"%@", [error localizedDescription]];
  8. }

打开CoreData的SQL语句输出开关

1.打开Product,点击EditScheme...
2.点击Arguments,在ArgumentsPassed On Launch中添加2项
1> -com.apple.CoreData.SQLDebug
2> 1

创建NSManagedObject的子类

默认情况下,利用Core Data取出的实体都是NSManagedObject类型的,能够利用键-值对来存取数据。但是一般情况下,实体在存取数据的基础上,有时还需要添加一些业务方法来完成一些其他任务,那么就必须创建NSManagedObject的子类

选择模型文件 

选择需要创建子类的实体 

创建完毕后,多了2个子类 

文件内容展示:
Person.h

  1. #import <Foundation/Foundation.h>
  2. #import <CoreData/CoreData.h>
  3. @class Card;
  4. @interface Person : NSManagedObject
  5. @property (nonatomic, retain) NSString * name;
  6. @property (nonatomic, retain) NSNumber * age;
  7. @property (nonatomic, retain) Card *card;
  8. @end

Person.m

  1. #import "Person.h"
  2. @implementation Person
  3. @dynamic name;
  4. @dynamic age;
  5. @dynamic card;
  6. @end

Card.h

  1. #import <Foundation/Foundation.h>
  2. #import <CoreData/CoreData.h>
  3. @class Person;
  4. @interface Card : NSManagedObject
  5. @property (nonatomic, retain) NSString * no;
  6. @property (nonatomic, retain) Person *person;
  7. @end

Card.m

  1. #import "Card.h"
  2. #import "Person.h"
  3. @implementation Card
  4. @dynamic no;
  5. @dynamic person;
  6. @end

那么往数据库中添加数据的时候就应该写了:

  1. Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
  2. person.name = @"MJ";
  3. person.age = [NSNumber numberWithInt:27];
  4. Card *card = [NSEntityDescription insertNewObjectForEntityForName:@”Card" inManagedObjectContext:context];
  5. card.no = @”4414245465656";
  6. person.card = card;
  7. // 最后调用[context save&error];保存数据

说到这里,整个Core Data框架的入门就结束了,其实Core Data还远不止这些功能,它还支持自动撤销机制,一对多关联等,这里就不一一介绍了

Core Data入门的更多相关文章

  1. 《驾驭Core Data》 第二章 Core Data入门

    本文由海水的味道编译整理,请勿转载,请勿用于商业用途.    当前版本号:0.4.0 第二章 Core Data入门 本章将讲解Core Data框架中涉及的基本概念,以及一个简单的Core Data ...

  2. Core Data入门-备用

    简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象. ...

  3. iOS: Core Data入门

    Core Data是ORM框架,很像.NET框架中的EntityFramework.使用的基本步骤是: 在项目属性里引入CoreData.framework (标准库) 在项目中新建DataModel ...

  4. Core Data 入门

    1. 基本概念 Core Data是一种被称为对象关系映射(Object-Relational Mapping,ORM)技术的实现. Core Data 架构图如下: 五个概念: (1)数据模型(Da ...

  5. Core Data-备用

    Core Data是一个功能强大的层,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互.Core Data将数据库行转换为OC对象(托管对象)来实现,这样无需 ...

  6. Core Data浅谈初级入门

    Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数 ...

  7. Core Data (二)备

    序 上次只是说了三个Core Data栈基本类.这次准备介绍一下常用的类. NSManagedObject Core Data是一次底层数据封装成面向对象的技术.最直接的表现就是在SQLite里面的一 ...

  8. 1. 初次尝试Core Data 应用程序(Core Data 应用开发实践指南)

    本书以实践的方式讲解 Core Data,不会过早讲一些难懂的话题.从入门知识入手,演示如何为范例程序添加Core Data 支持,后续章节再依次讨论更复杂的话题. 1.1. Core Data 是什 ...

  9. Asp.Net Core WebAPI入门整理(三)跨域处理

    一.Core  WebAPI中的跨域处理  1.在使用WebAPI项目的时候基本上都会用到跨域处理 2.Core WebAPI的项目中自带了跨域Cors的处理,不需要单独添加程序包 3.使用方法简单 ...

随机推荐

  1. checkbox改成radio效果,单选,取消

    $(function () {            var allBox = $(":checkbox");            allBox.click(function ( ...

  2. cookie与sessionID之间的关系实验

    上一篇介绍了cookie,这里来看看cookie与sessionID之间有什么关系. 一.编写测试用例代码 新建一个servlet如下: public class SessionServlet ext ...

  3. PDF 补丁丁 0.4.2.891 测试版发布:合并PDF文件时设置书签文本和样式

    新的测试版在合并文件界面增加了设置书签样式的功能.除了可以为所合并的图片(或PDF文件)指定书签文本之外,还可以指定其文本样式(文本颜色.粗体.斜体).如下图所示. 此外,合并文件界面还添加了文件夹历 ...

  4. 怎么设置 mysql 多主复制

    更新 其实本文主要来自www.digitalocean.com ,但是我没有买他们家的 VPS 用来 demo 了.只是用vagrant 来模拟了. 介绍 说说关于通过两台 vps 来扩展 mysql ...

  5. 理解squid的正向和反向代理

    1.相同点: 访问的走向都是:客户端 -> 代理服务器 ->真实服务器 ->代理服务器->客户端 2.不同点:正向代理语义上更侧重于,让代理服务器去帮忙请求某个网址.让代理服务 ...

  6. jquery 字数限制

    $("#TextArea1").keydown(function(){ 10 var curLength=$("#TextArea1").val().lengt ...

  7. CodeForces 441E(Codeforces Round #252 (Div. 2))

    思路:dp[i][now][mark][len]   i 表示当前第i 次now存的是后8位,mark为第9位为0还是1 len第九位往高位还有几位和第9位相等.  只存后8位的原因:操作只有200次 ...

  8. 二模 (5)day1

    第一题: 题目大意:解一元一次方程(只有+-符号): 解题过程:直接处理处两边的x的系数和常数项,字符串的处理即可. 第二题: 题目大意:求逆序对数. 解题过程:直接归并排序. 第三题: 题目大意:多 ...

  9. nginx日志切割

    脚本完成后将其存入 Nginx 安装目录的 sbin 中,取名为 cut-log.sh,之后使用 crontab -e 新增一个定时任务,在其中增加执行这个脚本: #!/bin/bash ## 零点执 ...

  10. 线程系列3---ThreadLocal类研究

    2013-12-23 17:44:44 Java为线程安全提供了一些工具类,如ThreadLocal类,它代表一个线程局部变量,通过把数据放在ThreadLocal中就可以让每个线程创建一个该变量的副 ...