美文网首页
coreData多实体关联相关

coreData多实体关联相关

作者: revolution丶 | 来源:发表于2017-09-07 16:46 被阅读90次

前言:

从上次写完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

免责声明

本文为本人作者总结及备忘记录,分享给大家供学习参考,部分内容有参考搜索引擎,若有侵权,联系本人删除

  • 最最后,若有错误,恳请斧正。

相关文章

  • coreData多实体关联相关

    前言: 从上次写完coreData的基础应用,到现在终于把当初的留下的多表关联的坑补上了。话不多说,图文走起。 开...

  • Xcode 升级以后找不到 NSManagedObject su

    我们升级Xcode后,在使用CoreData时,创建实体类关联时找不到 NSManagedObject subcl...

  • CoreData(创建关联类来操控CoreData实体对象)

    升级到Xcode8.3以后没怎么碰过coredata,今天突然要用到,就去搞了一下,以为还像之前那样第一步:第一步...

  • 10.hibernate的lazy策略

    提纲: lazy的概念和为什么 什么时候用lazy当前实体类与当前实体类关联的实体类关联多个实体:一对多,多对多关...

  • CoreData数据库操作关联操作

    CoreData数据库操作关联操作

  • 《我与你》读书笔记

    在《我与你》中,马丁•布伯的关系世界有三类:“与自然相关联的人生”“与人相关联的人生”及“与精神实体相关联的人生”...

  • iOS CoreData

    CoreData核心对象 实体管理类:NSManagedObject 实体描述类:NSEntityDescript...

  • 177、基于Python的Apriori和FP-growth关联

    关联分析用于发现用户购买不同的商品之间存在关联和相关联系,比如A商品和B商品存在很强的相关性,常用于实体商店或在线...

  • 面试题目

    1:Coredata讲解 Coredata是一个良好的对象图管理工具,那么对象图也就是实体⚠️实体包括两个部分,属...

  • 多实体关联(IOS学习)

    1.新建一个单视图时勾选Use Core Data 2.进入后会有一个 .xcdatamodeld 文件,鼠标单击...

网友评论

      本文标题:coreData多实体关联相关

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