上篇博客中讲了 CoreData 里增删改查的使用,学到这里已经可以应对简单的数据存储需求了。但是当数据模型复杂起来时,例如你的模型类中除了要存储 CoreData 里支持的数据类型外,还有一些自定义的数据类型,这个时候只靠单一的模型结构就没办法来满足这种需求了,于是我们就需要使用关联表结构,也就是我们这次要讲的内容。

简介

多表关联,相信接触过 SQL 数据库的朋友都不陌生,就是指可以在一张表的数据中可以引用另外一张表里的数据。QQ 里的好友关系,微博里的用户和微博条目之间都用到了多表之间的关联。同样的,在 CoreData 里,也可以实现这样的功能,而且 CoreData 比起传统的 SQL 数据库来,更加简单。

创建关联表

CoreData 里的多表关联,是通过 Entity 实体中的 Relationships 来实现的:

Relationships-w600

上篇文章中,我们已经创建好了一个 Student 实体,现在我们需要再创建两个实体,分别是 和 Course 分别代表班级和课程。首先来创建出这两张表。
Clazz 班级表:

Clazz-w600

Course 课程表:

Course-w600

表创建好后,我们来为这三张表建立关联关系,它们之间的关系是这样的:Student 里有一个 studentClass 字段代表学生所属的班级,一个 studentCourses 字段代表学生在学的所有课程;

Clazz 里有一个 classStudents 字段代表班级里所有的学生;Course 里有一个 courseStudents 代表学习这门课程的所有学生。可以看出来,这几个字段都是彼此关联的关系。根据上面说的,我们需要用 relationships 来创建这些关联的字段。
首先来创建 Student 里的两个关系:

studentClass-w600

先看 studentClass 字段,在 1 中,Destination 属性指的是和这个 字段建立关联的实体的名字,这里可以选择 DataModel 中的其他实体,也可以是当前的这个实体(好友关系中,就是和当前实体本身建立关联),这里我们选择 Clazz 实体,另外我们还可以在右侧的 Data Model Inspector 面板中配置一些当前 relationship 的其他信息,2 中的 Inverse 指的是在 Clazz 实体中和 studentClass 字段反向关联的字段,根据上面的描述,这里应该指定 classStudents;3 中的 Type 可以选择关联关系的类型,有 To One 和 To Many 两种选择,分别代表对一关系和对多关系,显然一个学生只能在一个班级里,所以这里选择 To One。同样的,来创建 studentCourses 字段,创建好之后是这样的:

studentCourses-w600

接下来,再来创建另外两个实体中剩下的两个字段:

Clazz 实体里的 classStudents 字段:

classStudents-w600

Course 实体里的 courseStudents 字段:

courseStudents-w600

需要说明的是,这两个字段反向关联到 Student 实体对应的字段的类型都是一对多的,这里记得要正确设置。然后设置 Inverse 后,Student 实体里对应的 Inverse 属性也会自动设置:

Students-w600

DataModel 除了上面这种展示方式,还可以展示为关系图的形式,点击右下角的切换键就可以切换过去:

-w600

在这种模式下,各个实体之间的关系就一目了然了,单个箭头表示的是对一的关系,双箭头就表示对多的关系。从这里可以很方便地检查我们的表关系有没有设置正确。

删除规则

关联表创建好后,还差一个比较重要的属性没有介绍,就是 Relationship 的删除规则:

-w300

删除规则(Delete Rule)规定了这条数据删除时,它所关联的数据该执行什么样的操作。这里有四种规则可以选择:

  • No Action
  • Nullify
  • Cascade
  • Deny

下面通过一个例子来说明这四个类型都有什么效果:

假如我们删除一名学生,
如果把 Delete Rule 设置成 No Action,它表示不做任何,这个时候学生所在的班级(Class.classStudents)依然会以为这名学生还在这个班级里,同时课程记录里也会以为学习这门课程(Course.courseStudents)的所有学生们里,还有这位学生,当我们访问到这两个属性时,就会出现异常情况,所以不建议设置这个规则;
如果设置成 Nullify,对应的,班级信息里就会把这名学生除名,课程记录里也会把这名学生的记录删除掉;
如果设置成 Cascade,它表示级联操作,这个时候,会把这个学生关联的班级以及课程,一股脑的都删除掉,
如果 Clazz 和 Course 里还关联着其他的表,而且也设置成 Cascade 的话,就还会删除下去;如果设置成 Deny,只有在学生关联的班级和课程都为 nil的情况下,这个学生才能被删除,否则,程序就会抛出异常。
所以这里,我们把 Student 的 studentClass 和 studentCourses 的删除规则设置成 Nullify 是最合适的。

nullify-w600

实体类生成

在有关联关系的实体里,对一关系是通过对应实体类的属性来表示的,对多属性则是实体类的集合,我们可以看一下 Xcode 自动生成的实体类代码(自动生成的代码默认在 /Users/userName/Library/Developer/Xcode/DerivedData/ProjectName/Build/Intermediates/ProjectName.build/Debug-iphonesimulator/ProjectName.build/DerivedSources/CoreDataGenerated/ProjectName/):

-w600

另外对关联表进行增删改查时和单表的增删改查没太大区别,只需需要配置一下关联的属性即可。

Student *student = [NSEntityDescription   insertNewObjectForEntityForName:@"Student" inManagedObjectContext:self.context];Clazz *clazz = [[Clazz alloc] initWithContext:self.context]; // configure clazz // .... student.studentClass = clazz; Course *english = [[Course alloc] initWithContext:self.context]; Course *math = [[Course alloc] initWithContext:self.context]; [student addStudentCoursesObject:english]; [student addStudentCourses:[NSSet setWithObjects:english, math, nil]]; [self.context save:nil];

调用 save 后,student 和它关联的 clazz、math、english 都会保存到数据库中。

到这里,CoreData 里关联表的创建也就讲完了,下次准备在讲一下 CoreData 里的并发操作。

转载于:https://www.cnblogs.com/Free-Thinker/p/7059715.html

CoreData 从入门到精通(三)关联表的创建相关推荐

  1. MySQL从入门到精通:多表查询的灵活运用_02

    我是 ABin-阿斌:写一生代码,创一世佳话,筑一揽芳华. 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦. 上一篇:MySQL从入门到精通:基本语法介绍与使用_01 下一篇:MySQL从 ...

  2. MySQL零基础从入门到精通(多表篇)

    MySQL零基础从入门到精通(多表篇) MySQL零基础从入门到精通(多表篇) 实际开发中,一个项目通常需要很多张表才能完成.例如:一个商城项目就需要分类表(category).商品表(product ...

  3. Kali Linux 从入门到精通(三)-入侵系统定制

    Kali Linux 从入门到精通(三)-入侵系统定制 定制 网络配置 临时IP地址 dhclient eth0 ifconfig eth0 192.168.11/24 route add defau ...

  4. CoreData 从入门到精通(五)CoreData 和 TableView 结合

    我们知道 CoreData 里存储的是具有相同结构的一系列数据的集合,TableView 正好是用列表来展示一系列具有相同结构的数据集合的.所以,要是 CoreData 和 TableView 能结合 ...

  5. C4D致富经典入门到精通(三)

    C4D样条曲线创建 C4D基础界面的介绍与常用快捷键:  C4D致富经典入门到精通(一) C4D父子关系的理解与创建参数几何体与可编辑对象: C4D致富经典入门到精通(二) C4D样条曲线创建 :  ...

  6. 12.从入门到精通:Python字典,创建字典,访问字典的值,修改字典,删除字典,字典键的特性,字典内置函数和方法

    12.从入门到精通:Python字典,创建字典,访问字典的值,修改字典,删除字典,字典键的特性,字典内置函数和方法 Python字典 创建空字典 访问字典里的值 修改字典 删除字典元素 字典键的特性 ...

  7. MyBatis从入门到精通(三):MyBatis XML方式的基本用法之多表查询

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. 多表查询 上篇博客中,我们示例的 ...

  8. jQuery 1.3 for Asp.Net、 CSLA.Net 3.6 for Windows 及 MOSS/WSS 一步一步从入门到精通三个系列的目录...

    jQuery for Asp.Net 一步一步从入门到精通(附 jQuery API 彩色大图) CSLA.Net 3.6 for Windows (C# 2008)一步一步从入门到精通 MOSS/W ...

  9. visual studio 2015 搭建python开发环境,python入门到精通[三]

    在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...

最新文章

  1. [Erlang33]使用recon从网页查看Erlang运行状态
  2. 吴恩达机器学习笔记:(二)代价函数
  3. Python中的向量、矩阵(numpy)
  4. 斯坦福CS229机器学习课程的数学基础(概率论)翻译完成
  5. Python3 函数(方法)
  6. Java面向对象设计原则
  7. python怎么做图表_python 制作表格
  8. 网络间谍在2017年被列为全球企业最为严重的威胁
  9. 个人优盘更新涉密计算机病毒库,在涉密计算机和非涉密计算机之间交叉使用优盘、移动硬盘等移动存储介质时,只要及时升级杀毒软件病毒库,就不会造成泄密 - 作业在线问答...
  10. Scala学习02——Scala类和对象
  11. python爬贴吧回复内容_Python爬虫_获取贴吧内容
  12. DNA 8. 癌症的突变异质性及寻找新的癌症驱动基因(MutSigCV)
  13. 本科毕业论文外文文献翻译怎么找?
  14. 深度学习vs深度学习,到底嘛意思?
  15. 地球的3D模型制作教程【3DsMax】
  16. FinalReport连接MYSQL数据库失败经验分享
  17. 离差(全距,平均偏差,半内四分位数间距,10~90百分位数间距,标准差)
  18. 简单介绍一下经济学中 比较优势 的概念
  19. SVM和Softmax分类器比较
  20. 服务治理深入浅出(1)- 服务治理出现的必要性探索

热门文章

  1. xml学习中的趣事一件----嘿嘿!
  2. 问题 J: Sequence Problem (II) : Array Practice
  3. php 打印 wap,PHP 输出简单动态WAP页面
  4. python运行界面黑色_selenium+python 去除启动的黑色cmd窗口方法
  5. Jmeterbadboy环境搭建
  6. Web 3.0项目Aluna.Social宣布将ALN代币将分发给2600多个早期采用者
  7. SAP License:搽皮鞋的提示
  8. 工程联盟管理平台、CRM、项目管理、合同管理、合作商管理、考勤管理、成本管理、指标管理、业主管理、工时报告、招投标、开票回单、物料库、培训中心、知识库、采购管理、Axure原型、产品原型、rp原型
  9. 互联网金融数据分析-笔记
  10. Oracle 获取表注释和列注释