CoreData 多表 关联

作者: _skye | 来源:发表于2015-06-16 15:23 被阅读6476次

1.概念简介

    coreData中存在复杂的数据关系时,一张表难以满足需求,此时就需要了解使用coreData多表的关联使用.

    如 课程表 和 章节表 的关系:一个课程跟章节的对应关系是 一对多,单一个章节只能对应一个课程; 而课程表 与 讲师表 之间的关系:一个课程可以有多个讲师,一个讲师也可以讲多个课程,他们之间是多对多的关系 .

    表之间就是靠这种相互约束的关系建立关联.

    假设要删除一个课程,与此课程相关联的章节是否删除;或者说删除一个章节,这个章节对应的课程是否删除.这个就涉及到多表操作,设置表之间的级联关系.接下来以coreData设置一一讲解

2.coreData 相关设置简介

1)删除关系

删除关系设置

A.ab->B :A对象指向B的删除关系ab被设置为:

No Action:当A被删除时,B对象不变,但会指向一个不存在的对象,一般不建议使用;

Nullify(作废):当A对象被删除时,B对象指向的A对象会置为空,如果A与B的关系式一对多,则是A对象从B容器中移除

Cascade(级联):当A对象被删除时,A对象指向的B对象也会被删除;

Deny(拒绝):当删除指向对象B存在的A对象时,操作将会被拒绝;

如:Course_Section: Cascade , 删除Course时,与Course相关联的Section都会被删除;

    Section_Course: Nullify , 删除Section时,与Section相关的Course不会被删除;

2)对象对应关系

对象对应关系

A.ab->B :A对象指向B的对应关系ab被设置为:

To Many: 表示一个A对象可以包含多个B对象;

To One: 表示一个A对象只能对应一个B对象;

如:Course_Section: To Many , 一门Course可以包含多个Section;

    Section_Course: To One ,一个Section只能指向一门Course;

所以Course与Section的关系是 1:N (1对多)

如:Course_Teacher: To Many , 一门Course可以包含多位Teacher;

    Teacher_Course: To Many ,一位Teacher可以指向多门Course;

所以Course与Section的关系是 M:N (多对多)

3.多表创建流程 

1)先创建需要的实体表(方法见"CoreData单表创建使用")

Course, Section, Teacher 表

2)建立关联 设置删除关系,对应关系如下(设置的具体含义已在文章第二部分介绍)

课程_教师 (一课程可包含多个教师,删除关系:作废) 课程_章节(一节课可包含多个章节,删除关系:级联) 章节_课程(一个章节只属于一个课程,删除关系:作废) 教师_课程(一个教师可以讲多门课,删除关系:作废)

创建之后查看style关系:

表关系

3)使用创建的对象生成相应地文件:.h和.m(方法见"CoreData单表创建使用")

根据3个对象创建的文件

    根据设置的对象之间的对应关系 会生成相应地属性和方法

Section对应一个课程时 添加课程对象的属性 课程对应的章节以及教师都是多个,生成NSSet 存储 并生成相应方法

NSSet 是一个无序的集合 ,可以使用NSSet 与NSArray根据需要转换使用,其他使用方法 同单表使用的增删查改,只是访问时多层访问.

如:NSPredicate*predict = [NSPredicate predicateWithFormat:@"section_course.courseId = %d",courseId];

如:self.courseEntity.course_teacher.count

........................................................................................................................................

coreData多表关联的基本操作已做一个简单的介绍,具体的功能还待使用者发掘,并且苹果提供了NSFetchController 与coreData结合使用,具体情节,还待下次分享......(欢迎批评指正~~)

相关文章

  • CoreData 多表 关联

    1.概念简介 coreData中存在复杂的数据关系时,一张表难以满足需求,此时就需要了解使用coreData多...

  • coredata 简单掌握多表查询

    coredata 碎知识点 coredata多表/关联 简单的使用 对象之间的对应关系 会生成相应的属性和方法 一...

  • MagicalRecord 多表关联数据操作

    最近在使用MagicalRecord做数据持久层CoreData的操作库,今天做了一个多表关联数据的操作,整理了一...

  • coreData多实体关联相关

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

  • python面试题01

    1、什么是多表关联查询,有几种多表关联的查询方式,分别是什么? 多表关联查询概念: 多表关联查询分类:1.1内连接...

  • CoreData数据库操作关联操作

    CoreData数据库操作关联操作

  • mysql实现多表关联

    mysql实现多表关联 mysql关联单张表

  • Mysql 一些实用方法笔记!

    sql 注入: sql 导入数据: 批量插入数据: sql 关联更新多表数据: sql 关联删除多表数据: mys...

  • 2018-09-21数据库&多表关联&增删改&a

    数据库&多表关联&增删改&数据库备份 多表关联 两表关联,必须有一个关联字段 关联方法 where(原理) 第一步...

  • MapReduce实现‘多表关联’

    多表关联和单表关联相似,都类似于数据库中的自然连接。相比单表关联,多表关联的左右表和连接列更加清楚。所以可以采用和...

网友评论

  • zh_19:赞
  • 猪猪的思维有点长:请问我需要一对多的数据是有序的怎么办,把Set转化成Array不会导致保存时候的顺序乱掉吗?
  • 肥朝:文中提到的"NSSet 是一个无序的集合 ,可以使用NSSet 与NSArray根据需要转换使用"这里说的转换具体是如何转换呢?
    肥朝:@_skye 谢谢
    _skye:@肥朝 这个查询API 可以发现 比如 1).读出内部数据,一一使用[self.courseEntity.course_section enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
    NSLog(@"-------------obj %@", obj);

    }];
    2)array转为NSSet.+ (instancetype)setWithArray:(NSArray<ObjectType> *)array
    3)Set转为有序的数组
    - (NSArray<ObjectType> *)sortedArrayUsingDescriptors:(NSArray<NSSortDescriptor *> *)sortDescriptors
    当然还有其他的方法
  • 丶小六丶:@merrylaugh 在存入的时候怎么存,比如课程和章节,只要对课程及课程里的章节赋值就可以吗?
    Aliv丶Zz:@_skye 用自己生成的方法去修改set的内容,增加、删除set的内容,如果重启app后,删除无效,增加是ok的,博主指导原因吗?
    _skye: @丶小六丶 条件:已知CourseEntity *courseEntity1 :当创建SectionEntity *sectionEntity1后, 指定sectionEntity1.section_course = courseEntity1; 然后保存sectionEntity1就可以了; 以上是我使用的方法,当然你也可以尝试一下[courseEntity1 addCourse_SectionObject:sectionEntity1].
  • 6c917c9e2bf1:不错不错....
  • lsif的简书:果断收藏

本文标题:CoreData 多表 关联

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