美文网首页iOS零碎知识iOS工程实践iOS数据库
iOS基础-CoreData--使用总结关联操作

iOS基础-CoreData--使用总结关联操作

作者: 云之君兮鹏 | 来源:发表于2016-06-28 23:12 被阅读1424次

    东风不与周郎便,铜雀春深锁二乔!<太阳珊瑚>


    • <big>CoreData</big> 数据持久化框架是Cocoa API的一部分,它允许按照 实体-属性-值 模型组织数据,并以XML(做MAC-os用), 二进制, 或者SQLite数据文件的格式持久化数据. CoreData主要提供 对象-关系映射(ORM)功能,把OC对象转化为数据保存到文件,也可以数据转化成OC对象.

    • CoreData与SQLite区别 :
    • CoreData是官方推出的数据持久化框架,SQLite是苹果使用别人开发好的一个动态库,本质是关系型数据库.
    • CoreData是iOS平台下的一个数据持久化的方式,不可以跨平台使用,Sqlite可以跨平台使用.
    • ---- CoreData -----
      1: 可视化,不用再写 SQL 语句,大量简化代码.
      2: 可以实现多种文件格式 : NSSQLLiteStoreType, BSXMLStoreType 等
      3: 与iOS紧密结合, 只能用于开发iOS.
      4: 存储内容, 以对象的形式存储, 符合面向对象的思想.
    • ---- SQLite ----
      1: 是一个轻量级数据库而且功能强大的关系型数据库, 很容易被嵌入到应用当中, 可移植性高, 可以在多个平台使用.
      2: 和CoreData 不一样的是, SQLite 是使用程序式的.sql的主要操作方法,是直接操作数据
      3: 基于C接口, 使用SQL语句, 代码繁琐.
      4: 在处理大量数据时,表关系更直观一些,
      5: OC中不是可视化的
    • 核心对象:

    NSPersistentStoreCoordinator 数据连接器类(中间人,不能直接控制)
    NSManagedObjectContext 数据管理器类 (临时数据库 )
    NSManagedObject 数据管理类
    NSManagedObject 数据模型器类
    NSEntityDescription 实体描述类

    • NSManagedObjectContext (被管理的上下文)
      1: 操作实际内容 (对持久层的一个操作)
      2: 插入数据, 查询数据, 删除数据,修改数据
      3: 是我们开发中主要交互的类, 数据的CRUD都通过这个Context(上下文)去触发命令并返回结果.
    • NSManagedObjectModel (被管理的数据模型)
      1: 包含了各个实体(表)的定义信息, 包含了表或者是数据库的结构.
      2: 用来添加实体的属性,建立属性之间的关系.
      3: 操作方法: 视图编辑器,也可以用代码.
      4: 构建整个数据库的表结构, 表字段类型, 表与表之间的关系等等, 凡是和数据结构有关系的定义, 通通都通过这个类来管理.

    • NSPersistentStoreCoordinator (持久化数据助理)
      1: 相当于数据库的连接器
      2: 作用: 设置数据存储的名字, 位置,存储方式, 存储时机.
      3: 原理: 从下层文件取出数据, 交给上层的被管理的对象上下文
      4: 实际上这个类才是真正意义上跟数据库(.sqlite文件)打交道的,主要是根据 NSManagedObjectModel 执行表结构的建立通过 NSManagedObjectContext的命令执行数据交互.

    • 操作的思想流程:

    context想要获取值,先要告诉连接器,我要什么东西,连接器再告诉store,你给我什么东西,store去找,找到之后返回给context.

    CoreData核心关系类

    CoreData 数据库的简单操作:

    .xcdatamodeld里:
    1. Add Entity 添加实体类
    1. 修改实体类名
    2. 修改属性名与类型
    3. 创建文件 command+N —> CoreData —> NSManageObjuect subclass

    一般使用的步骤:

    // 导入CoreData框架
    // 导入需要的类

    
    #import <CoreData/CoreData.h>
    #import "Person.h"
    #import "AppDelegate.h"
    

    第一步: 当前自身的数据库连接器与APP的绑定

    //通过单例的代理协议的代理人,获取到我们最开始使用的 AppDelegate 
    
        AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
        
    //获得 数据库的数据连接器 (定义一个`@property (nonatomic, strong) NSManagedObjectContext *objectContext;`)
    
        self.objectContext = app.managedObjectContext;
    
    • 向数据库添加数据:

    方式1:
    /NSEntityDescription :实体描述类,通过类方法创建
    //参数1 :表示这个实体描述类描述的是哪个实体
    //参数2 :表示的是在context里创建一个描述,告诉context我要往里面插入以object了
    NSEntityDescription *description = [NSEntityDescriptionentityForName:@"Person" inManagedObjectContext:self.objectContext];
    //创建一个实体类
    //参数1 :实体类描述
    //参数2 :在context里放入这个类
    Person person = [[Person alloc] initWithEntity:description insertIntoManagedObjectContext:self.objectContext];
    方式2: 上面的两步骤合并为一个步骤
    /

    Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.objectContext];
    /
    //把context保存到本地
    //这个方法执行之后,本地数据才发生改变
    NSError
    error =nil;
    [self.objectContext save:&error];
    if(error ==nil)
    {
    NSLog(@"保存正确"); // 可以再次重新加载数据
    }else
    {
    NSLog(@"错误%@",error);
    }

    - 删除数据
    >```code
    // 获取想要删的数据 依情况而定
    Person *person = self.dataArray[indexPath.row];      
    // 在context中将这条数据删除
      [self.objectContext deleteObject:person];
       NSError *error = nil; 
    // 保存一下
      [self.objectContext save:&error];               
    if (error == nil) { 
    NSLog(@"删除成功");
     }```
    
    - 修改数据
    >```code
      // 知道改谁  找到你要改的对象
        Person *person = self.dataArray[indexPath.row];
    // 修改值    
    int number = arc4random() % 2000;
    person.name = [NSString stringWithFormat:@"%d 好", number];   
    // 保存修改的东西到数据库
    NSError *error = nil;
    [self.objectContext save:&error];
     if (error == nil) 
    { 
    NSLog(@"修改成功了");
    }   
    
    • 查询数据

    //创建一个查询操作,查询哪个表里的内容
    NSFetchRequestrequest = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
    //接收查询数据
    NSError
    error =nil;
    // 返回的是一个查询结果的数组所以接收一下
    NSArray*array = [self.objectContext executeFetchRequest:request error:&error];
    //判断error
    if(error ==nil) {
    //如果是,那就查到成功 可以放到dataArray里面然后去加载视图显示 可以通过谓词按照你的需求去查找
    NSLog(@"查找成功!");
    }

    
    
    ------------------
    多表的关联
    --------------
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ![](https://img.haomeiwen.com/i1523603/bb23784e6b24dd72.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    ![](https://img.haomeiwen.com/i1523603/708c69d7eb4b4925.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ![](https://img.haomeiwen.com/i1523603/192a931d8284a4f8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    
    
    
    ![](https://img.haomeiwen.com/i1523603/a10ba49d8614c0d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    
    
    
    
    
    ![](https://img.haomeiwen.com/i1523603/82d7510c0611d0b5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    相关文章

      网友评论

      本文标题:iOS基础-CoreData--使用总结关联操作

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