简介
- Core Data 是iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据。使用Core Data框架,程序员可以很轻松有效地通过面向对象的接口管理数据
- Core Data是一个模型层的技术。帮助建立代表程序状态的模型层,Core Data也是一种持久化技术,能将模型对象的状态持久化到磁盘,但它最重要的特点是:
- 在数据操作过程中,无需编写任何 SQL 语句 Core Data 使用包括实体和实体间关系,以及查找符合某些条件实体的请求等内容
- 开发者可以在纯对象层上查找与管理这些数据,而不必担心存储和查找的实现细节
- Core Data 框架最早出现在 Mac OS X 10.4 Tiger 与 iOS 3.0 系统,经过成千上万的应用程序以及数以百万用户的反复的验证,Core Data 确实已经是一套非常成熟的框架
- CoreData 利用了 Objective-C 语言和运行时,巧妙地集成了 Core Foundation 框架。是一个易于使用的框架,不仅可以优雅地管理对象图,而且在内存管理方面表现异常优异
Core Data Stack 示意图
Core Data stack 是 Core Data的核心,由一组 Core Data 核心对象组成
- NSManagedObjectModel 被管理对象模型
- NSPersistentStoreCoordinator 负责将数据保存到磁盘
- NSManagedObjectContext 负责管理模型对象的集合
快速使用
操作步骤
1. 准备工作
- 新建项目,勾选User Core Data
- 打开系统默认创建的 XXX.xcdatamodeld
- 创建实体 - Entity类似与 SQLite 中的表,不过更像是 OC 中的类
-
选择 Add Entity,建立如下图所示的实体
- 选择菜单项 Editor - Create NSManagedObject SubClasses,勾选所有看到的选项,两次 Next
-
调整目录结构,调整完成之后的目录结构示意图如下图所示
2. 数据准备
代码准备
- 在 ViewController.m 中定义两个只读属性,代码如下:
#import "Person.h"
#import "AppDelegate.h"
@interface ViewController ()
@property (nonatomic, readonly) NSManagedObjectContext *ctx;
@property (nonatomic, retain) AppDelegate *appDelegate;
@end
@implementation ViewController
- (AppDelegate *)appDelegate {
return [UIApplication sharedApplication].delegate;
}
- (NSManagedObjectContext *)ctx {
return self.appDelegate.managedObjectContext;
}
插入数据
- 添加 insertPerson 方法
- (void)insertPerson {
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.ctx];
p.name = @"张三";
p.age = @19;
p.birthday = [NSDate date];
p.height = @1.8;
NSLog(@"%@", NSHomeDirectory());
[self.appDelegate saveContext];
}
修改数据
- 在私有扩展中增加属性
@property (nonatomic) Person *currentPerson;
- 修改 insertPerson 方法,记录 currentPerson
/// 插入数据
- (void)insertPerson {
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.ctx];
p.name = @"张三";
p.age = @19;
p.birthday = [NSDate date];
p.height = @1.8;
[self.appDelegate saveContext];
self.currentPerson = p;
NSLog(@"数据插入成功");
}
- 添加 updatePerson 方法,并在 touch 方法中调用
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self updatePerson];
}
#pragma mark - 数据操作
- (void)updatePerson {
self.currentPerson.name = @"李四";
[self.appDelegate saveContext];
NSLog(@"修改成功");
}
删除数据
- 添加 deletePerson 方法,并在 touch 方法中调用
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self deletePerson];
}
#pragma mark - 数据操作
- (void)deletePerson {
[self.ctx deleteObject:self.currentPerson];
[self.appDelegate saveContext];
NSLog(@"删除成功");
}
基本操作小结
批量插入数据
- 新增函数 manyPersons 如下
/// 批量插入数据
- (void)manyPersons {
NSTimeInterval start = CACurrentMediaTime();
NSLog(@"开始");
for (NSInteger i = 0; i < 100000; i++) {
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.ctx];
p.name = [@"zhangsan" stringByAppendingFormat:@"%zd", i];
p.age = @19;
p.birthday = [NSDate date];
p.height = @1.8;
}
[self.appDelegate saveContext];
NSLog(@"完成 %f", CACurrentMediaTime() - start);
}
- 插入 10万条记录只需要 1.5s
阶段性小结
- 新建项目时,勾选 Core Data 一切都变得那么简单 :D
- 纯面向对象方式开发,程序员更容易上手
- 自带事务处理,性能优异
- 在调用 saveContext 之前,一切数据操作都是真对内存中的 - 对象图 进行的处理