简介

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.搭建上下文环境

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

2.添加数据到数据库

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

3.从数据库中查询数据

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

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

4.删除数据库中的数据

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

打开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

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>@class Card;@interface Person : NSManagedObject@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * age;
@property (nonatomic, retain) Card *card;@end

Person.m

#import "Person.h"@implementation Person@dynamic name;
@dynamic age;
@dynamic card;@end

Card.h

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

Card.m

#import "Card.h"
#import "Person.h"@implementation Card@dynamic no;
@dynamic person;@end

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

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

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

Core Data入门相关推荐

  1. ios并发会造成什么问题_iOS Core data多线程并发访问的问题

    大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的 ...

  2. Core Data 教程入门

    原文:Getting Started with Core Data Tutorial 作者:Pietro Rea 译者:kmyhy 这是<Core Data by Turoials>一书的 ...

  3. 52ABP实战系列 NET CORE实战入门视频课程出来啦

    " .NET CORE实战入门视频,要是有讲的不好的地方,还请留言." 早安! 各位道友好,.NET CORE入门视频的第一章已经录制完毕了.视频会放在传课网.网易云课堂及segm ...

  4. [52ABP实战系列] .NET CORE实战入门视频课程出来啦

    " .NET CORE实战入门视频,要是有讲的不好的地方,还请留言." 早安! 各位道友好,.NET CORE入门视频的第一章已经录制完毕了.视频会放在传课网.网易云课堂及segm ...

  5. 张高兴的 .NET Core IoT 入门指南:(四)使用 SPI 进行通信

    张高兴的 .NET Core IoT 入门指南:(四)使用 SPI 进行通信 什么是 SPI 和上一篇文章的 I2C 总线一样,SPI(Serial Peripheral Interface,串行外设 ...

  6. iOS Core Data

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

  7. core data 学习笔记

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

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

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

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

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

最新文章

  1. 凭借这 10 大算法,就可以主宰世界!
  2. SAP与Ariba在数据分析领域的互补共赢
  3. AP1242G胖转瘦,廋转胖
  4. 列表-使用del关键字从列表删除数据
  5. 【转】最牛B的编码套路
  6. Linux 设备驱动的固件加载
  7. JavaScript数组对象简介及其常用方法介绍
  8. android状态机是线程么,安卓StateMachine运行过程理解(翻译)
  9. win10搭建Linux子系统,win10中搭建Linux子系统
  10. Flask+Gunicorn(协程)高并发的解决方法探究
  11. php strrew,友价域名交易系统nginx环境的伪静态规则
  12. 代码管理学:正确理解工作,并不是你想的那样容易
  13. Python3 安装RobotFramework
  14. Python绘图模块 -- turtle
  15. Android deeplink原理解析
  16. SSH连接服务器断开
  17. 三方支付四方支付聚合支付系统 集成 支付宝分账 代付 多商户 短信邮件 谷歌令牌验证
  18. VSS配置及使用说明
  19. ES6中字符串和数组新增的方法
  20. 十秒钟入门一分钟搭建Discuz论坛

热门文章

  1. parted分区并加入lvm
  2. 探秘区块链技术在计算机取证过程中的机制与应用
  3. Timer类中的 scheduleAtFixedRate与schedule
  4. winhex 手工恢复佳能70D视频过程
  5. 打印机状态返回说明(针对串口打印机)
  6. 计算机学院春节祝福词,【CES·新年】计算机学院给您送祝福啦!
  7. 页眉、页脚及页码的设置(fancyhdr宏包的使用)
  8. fullpage.js 滑入滑出滚屏动画, 纯css方式。利用css权重,无需js操作dom
  9. mnv -v报错JAVA_HOME配置有问题
  10. 古筝考级与教学(周望)