Core Data

1、Core Data基本概念

1.1 概述

  • Core Data不是数据库,而是使⽤数据库、XML、⼆进制⽂件等方式来存储数据的⼀个框架。
    • Core Data是iOS3以后才出现的一个框架,容许咱们以⾯向对象的⽅式储存和管理数据。使⽤用Core Data框架,咱们能够很轻松有效地经过面向对象的接口管理数据。
  • Core Data框架提供了对象-关系映射(ORM)的功能,即可以将OC对象转化成数据,保存在SQLite3数据库⽂件中,也可以将保存在数据库中的数据还原成OC对象。
  •  在数据操做过程当中,⽆需编写任何SQL语句。

1.2 CoreData核心对象

  •  NSManagedObject:模型对象,或者叫实体(entity),可理解为OC里的对象。sql

  • NSManagedObjectModel:模型文件(.xcdatamodeld),记录全部的模型对象及对象的属性数据库

  • NSPersistentStoreCoordinator:持久化存储协调者,是数据库和程序之间的桥梁, ⽤用来设置数据存储的名字,位置,存储方式,和存储时机。⽤用来执行具体的CRUD操做。
  • NSManagedObjectContext:对象管理上下文,用户全部的持久化操做都是经过此对象。再由此对象去调用NSPersistentStoreCoordinator对象执行具体的操做。

1.3 模块详细讲解

一、应用程序先建立或读取模型文件(后缀为xcdatamodeld)生成 NSManagedObjectModel 对象。 Document应⽤程序是通常是经过 NSDocument 或其子类 NSPersistentDocument)从模型文件(后缀为 xcdatamodeld)读取。
二、而后⽣成 NSManagedObjectContext 和 NSPersistentStoreCoordinator 对象,前者对用户透明地调用后 者对数据文件进行读写。app

三、NSPersistentStoreCoordinator 负责从数据文件(xml, sqlite,⼆进制⽂件等)中读取数据⽣成 Managed Object,或保存 Managed Object 写入数据⽂文件。
四、NSManagedObjectContext 参与对数据进行各类操做的整个过程,它持有 Managed Object。咱们经过它 来监测 Managed Object。监测数据对象有两个做⽤:支持 undo/redo 以及数据绑定。这个类是最常被⽤用到 的。框架

五、Array Controller, Object Controller, Tree Controller 这些控制器⼀般与 NSManagedObjectContext 关联, 所以咱们能够经过它们在 nib 中可视化地操做数据对象。fetch


2、Core Data的使用spa

2.1 保存数据的方式 

  • 偏好设置(NSUserDefault)
  • 归档
  • sqlite
  • CoreData (基于sqlite的封装, 数据保存到一个数据库文件)

2.2 建立模型

1. 建立模型文件 (至关于数据库)

按如下步骤:代理

  1. command + N (或右键 New File...)
  2. Core Data
  3. Data Model
  4. 建立文件 (文件扩展名为 .xcdatamodeld), 而后命名文件名

2. 添加实体 (至关于表)

按如下步骤:code

  1. 点击 Add Entity (添加实体)
  2. 修改实体名 Entity 

3. 右端添加表的字段 (例如name, age, height)

2.3 搭建上下文环境

  •  生成上下文, 关联模型文件生成数据库orm

  • 导入头文件 #import <CoreData/CoreData.h> sqlite

1.初始化NSManagedObjectModel对象, 加载模型文件, 读取app中的全部实体信息;

2.初始化NSPersistentStoreCoordinator对象, 添加持久化库(这里采起SQLite数据库);

3.初始化NSManagedObjectContext对象, 拿到这个上下文对象操做实体, 进行CRUD操做.

3、 实现增删改查

3.1 添加数据(增)

得到AppDelegate的代理对象

AppDelegate *delegate = [UIApplication sharedApplication].delegate;

添加实体对象

// 建立实体对象
    // NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:delegate.managedObjectContext];

    //添加一个实体对象到 managedObjectContext 中
    User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:delegate.managedObjectContext];
    user.userID = @10002;
    user.userName = @"怀化";
    user.userAge = @30;
    user.userSex = @"男";
    user.userDate = [NSDate date];

保存上下文:

[delegate saveContext];

3.2 查询数据(查)

建立一个取值请求:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];

使用谓词设置查询条件:

request.predicate = [NSPredicate predicateWithFormat:@"userAge < 35"];
request.predicate = [NSPredicate predicateWithFormat:@"userName LIKE '*杨*'"];

设置查询的条数:

request.fetchLimit = 2;

指定从某个位置开始查询(分页效果)

request.fetchOffset = 2;

按某个字段升序、降序排列(YES为升序,NO为降序)

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"userAge" ascending:YES];
    request.sortDescriptors = @[sort];

在上下文中执行取值请求:

NSArray *objects = [delegate.managedObjectContext executeFetchRequest:request error:&error];

    [objects enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        User *user = (User *)obj;

        NSLog(@"%@ %@ %@ %@ %@",user.userID, user.userName, user.userAge, user.userSex, user.userDate);
    }];

以下NSFetchRequest 经常使用方法:

-setEntity: 设置你要查询的数据对象的类型(Entity)
-setPredicate: 设置查询条件
-setFetchLimit: 设置最大查询对象数目
-setSortDescriptors: 设置查询结果的排序方法
-setAffectedStores: 设置能够在哪些数据存储中查询

3.3 修改数据数据(改)

查询:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];
    request.predicate = [NSPredicate predicateWithFormat:@"userID == '10005'"];

    NSArray *objects = [delegate.managedObjectContext executeFetchRequest:request error:nil];

修改:

[objects enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
       User *user = (User *)obj;
   user.userDate = [NSDate date];
    //保存
       [delegate saveContext];
}

3.4 删除数据(删)

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];
    request.predicate = [NSPredicate predicateWithFormat:@"userID == '10005'"];

    NSArray *objects = [delegate.managedObjectContext executeFetchRequest:request error:nil];

    [objects enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        //删除
        [delegate.managedObjectContext deleteObject:obj];

        // 保存
        [delegate saveContext];
    }];
相关文章
相关标签/搜索