Core Data(iOS)

作者: Dream_Maker | 来源:发表于2016-01-20 15:09 被阅读320次

简介

  • 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 之前,一切数据操作都是真对内存中的 - 对象图 进行的处理

相关文章

网友评论

    本文标题:Core Data(iOS)

    本文链接:https://www.haomeiwen.com/subject/mhhlkttx.html