前言:
从上次写完coreData的基础应用,到现在终于把当初的留下的多表关联的坑补上了。话不多说,图文走起。
开发环境
xcode 8.3.1 ;iOS >8.0 ;语言:OC
coreData多实体关联
在开始代码前先设计一个模型,即多实体相关现实模型,如下:
1、某公司有若干员工,员工即可抽象成一个实体,其属性包括编号,名称,所属部门等。
2、员工拥有行政分组,即所属部门有所不同,行政分组可抽象成一个实体,其属性包括名称,所属员工等,重点来了,一个行政分组实体对应多个员工,一个员工只对应一个行政分组,即行政分组实体对应员工实体关系为一对多,员工实体对应行政分组实体关系为一对多。
3、员工拥有报销成本分组(下文称成本分组),即报销款项的多少有所不同,成本分组可抽象成一个实体,其属性包括名称,所属员工等,重点又来了,一个成本分组实体对应多个员工,一个员工只对应一个成本分组,即成本分组实体对应员工实体关系为一对多,员工实体对应成本分组实体关系为一对多。
4、为了让我们的多实体关联关系复杂一点,我们人为规定,让行政分组与成本分组拥有多对多的关系,即同一个行政分组可能有几个不同成本分组,同一个成本分组可能分属于不同行政分组。
开始建实体
实体建完了,下一步是添加关系,观察实体中添加属性的下面有Relationship字样,这就是添加关系的地方。点击+,Relationship即关系的名称,一般的我们要添加与谁的关联就把关系名称写成该对象即可,比如在员工实体中添加一个对行政分组的关系,Relationship写organizationDept。Destination有下拉选项,选项可以看到是其他实体,对的,你要和谁有关联就选中谁。最后一项Inverse也下拉,但目前还没有备选内容,等会在来看。添加完员工对行政分组的实体关系,我们再选中行政分组实体,照着上文添加一个对员工的实体关系。到添加Inverse时发现这会有选项了,没错就一项就选你自己,然后我们再去员工实体看Inverse,发现已经被自动补上了。这样我们就建立了实体间的关系。系统默认为一对一(one by one),那我们怎么修改呢,看图:
修改红框中Type的类型即可。
除了Type,重要的还有delete rule,即定义关联属性的删除规则。在当前对象和其他对象有关联关系时,当前对象被删除后与之关联对象的反应。这个参数有备选项:
- NSNoActionDeleteRule 删除后没有任何操作,也不会将关联对象的关联属性指向nil。删除后使用关联对象的关联属性,可能会导致其他问题。
- NSNullifyDeleteRule 删除后会将关联对象的关联属性指向nil,这是默认值。
- NSCascadeDeleteRule 删除当前对象后,会将与之关联的对象也一并删除。
- NSDenyDeleteRule 在删除当前对象时,如果当前对象还指向其他关联对象,则当前对象不能被删除。
然后就是按照之前的1234点添加关联关系,添加完成后生成文件,(生成方法参照这里)。
然后我们选择行政分组的CoreDataProperties.h文件发现除了其本身的属性外多了相关关系,如果是一对一,则是一个属性
@property (nullable, nonatomic, copy) NSString *name;
@property (nonatomic) int64_t orgId;
@property (nullable, nonatomic, retain) NSSet<CostDept *> *costDept;
@property (nullable, nonatomic, retain) SEmployee *semployee;
而如果是一对多则如红框所示,是一个NSSet
至于NSSet,它是一个无序的集合,你可以理解成没有排序的数组,这里面保存这若干个“一对多”中的“多”的具体实体。其他的不在赘述。
注意
- 当你添加了多个实体的关系后,你改变其中一个实体的值,跟它有关联的实体对应的值也会跟着变。如果你的员工“张三”属于“销售”行政分组,你修改了“张三”的名字为“张四”,那么你查“销售”分组中的员工姓名就从“张三”变成了“张四”。
- 还是强调关联了实体关系后,如果要执行删除操作,
一定要先脑袋中过一遍会影响到的实体!
一定要先脑袋中过一遍会影响到的实体!
一定要先脑袋中过一遍会影响到的实体!
尽管你说我deleteRule选了Null,但是任有可能被置为nil的对象会影响程序。
最后
附上个小Demo(注:这个demo地址上github,要是打开慢请耐心等待)解释下这个demo是我之前写的,里面有两个.xcdatamodeld文件,在viewController的viewDidLoad 方法中,可自行注释掉一个放开另一个。
DeptAndEmpCoreData.xcdatamodeld
两个实体:Employee与Department
关系为:
- 一个Employee对一个Employee
- 一个Department对多个Employee
DeptAndCostModel.xcdatamodeld
三个实体:OrganizationDept、CostDept、SEmployee
关系为:
- 多个OrganizationDept对多个CostDept
- 多个CostDept对多个OrganizationDept
- 一个OrganizationDept对一个SEmployee
- 一个CostDept对一个SEmployee
- 一个SEmployee对一个OrganizationDept
- 一个SEmployee对一个CostDept
免责声明
本文为本人作者总结及备忘记录,分享给大家供学习参考,部分内容有参考搜索引擎,若有侵权,联系本人删除
- 最最后,若有错误,恳请斧正。