16-CoreData之多表关联(存储自定义数据模型)

多表关联

1.1-简介

  • 什么是多表关联

    • 在处理数据库的关系中,无非只有三种关系

    • 一对一:一个老师只能在一个教室上课,不可能同时在两个教室上课

    • 一对多:一个教室可以有多个学生,但一个学生只能在一个教室

    • 多对多:一门学科可以有多个学生,一个学生也可以学习多门学科

    • 本小节我们主要学习一对多的关联,通过学习一对多来举一反三其他两种关系

    1.2-如果在模型文件中对两个实体之间进行关联?

    • 给教室关联学生

这里写图片描述

  • 给学生关联教室

    这里写图片描述

  • Type:

    • toOne:只指向一个对象(可用于某一个属性是自定义数据模型)
    • toMany:可以包含多个对象(一般是集合类型,可用于某一个属性是数组,数组中是自定义模型)
  • 添加数据

  • ClassRoom *room = [kManagedObjectContext getManagedObjectModel:@"ClassRoom"];
    
    room.roomNumber = @"1302";
    
    Student *student = [kManagedObjectContext getManagedObjectModel:@"Student"];
    student.name = @"李四";
    
    [room addStudentObject:student];
    //    student.classRoom = room;
    
    [kManagedObjectContext save];
    • 注意上面注释的那行代码,如果不写的话只是把学生加到了这间教室,但是并没有指定这个学生属于哪间教室,所以学生的classRoom属性在数据库中为null

      • 很显然这是不符合常规逻辑了,既然学生与教室已经进行了一对多的关联,那么把学生加到教室自然就应该知道这个学生属于哪间教室

      • 那么如何不写student.classRoom = room也能让学生的数据库表格中的classRoom有对应的值呢?

      • 我们需要在模型文件的关联中设置反转属性

    这里写图片描述

    1.3-删除关联

    1.3.1-简介

    • 什么是删除关联

      • 当两个表进行关联之后,删除其中一个表的数据对另一个表产生的影响

    1.3.2-如何设置删除关联

    • 点击实体对应的关系实体,右方有一个Delete Rule选项

    这里写图片描述

    • 这里以上图中设置学生的关联实体教室为例

    1.3.3-Nullify(为空)

    • 如果设置教室相对于学生的删除关联为Nullify,则表示:如果删除教室,学生并不会删除,只是学生的教室为null

    1.3.4-Cascade(级联)

    • 如果设置教室相对于学生的删除关联为Cascade,则表示:如果删除学生,则学生对应的教室也会被删除

    1.3.5-Deny(拒绝)

    • 如果设置教室相对于学生的删除关联为Deny,则表示:只要教室存在,就无法删除学生,要想删除学生,就要先删除教室

    1.4-删除关联总结

    • 模拟真实需求:

      • 删除学生,对应的教室不会被删除
      • 只要删除教室,教室里的学生就删除
      • 我该如何设置
    • 设置教室实体中的删除关联为Cascade(级联),设置学生实体中删除关系为no Action(表示删除学生不会对教室有影响)

posted @ 2018-06-19 19:26  心泪无恒  阅读(379)  评论(0编辑  收藏  举报