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结合使用,具体情节,还待下次分享......(欢迎批评指正~~)

    相关文章

      网友评论

      • 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