zoukankan      html  css  js  c++  java
  • iOS开发CoreData的多表关联

    1、多表关联

      多表关联,对SQL 数据库的操作,在一张表的数据中可以引用另外一张表里的数据。通过 Entity 实体中的 Relationships 来实现,比起传统的 SQL 数据库来,更加简单。

    2、如何关联

      本例中有三个实体Classes(班级)、Course(课表)、Student(学生),也就是三张表。

      Student学生只会在一个班级,多张课表两种关联属性;对应的Classes班级只会有多少个学生一种对应关系;Course课表也和多少个学生一种对应关系。

      以Student这个实体为例:studentCourses学生课表关联属性、studentClass学生班级关联属性。

      1)Relationship:关联属性名

      2) Destnation:关联属性的所属类

      3)Inverse:所属类的关联属性

      4)Delete Rule:删除规则

        No Action:表示删除学生时,班级和课表不做任何处理(认为学生还在,会造成异常,不建议使用)

        Nullify:表示删除学生时,班级和课表也会删除对应学生

        Cascade:表示删除学生时,班级和课表也会全部删除(级联操作,如果班级和课表也有级联操作,相关表都会删除)

        Deny:表示删除学生时,班级和课表会拒绝,只有班级和课表为nil时,才会删除学生

      5)Type:To One 和 To Many 两种选择,一个学生只会在一个班级所有选择To One,而课表一对多选择To Many

      另外两个实体的关联图:

      注意:在没有创建Course和Classes的关联属性时,Student的关联关系中Inverse没有选项的;

           如果在创建Course和Classes的关联属性之前创建了Student的关联属性,选择Course和Classes的Inverse之后,Student的Inverse会自动填充。

    3、生成实体类

      以Student为例,选择To Many时生成的是NSSet集合!

    #import "Student+CoreDataClass.h"
    
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface Student (CoreDataProperties)
    
    + (NSFetchRequest<Student *> *)fetchRequest;
    
    @property (nullable, nonatomic, copy) NSString *age;
    @property (nullable, nonatomic, copy) NSString *name;
    @property (nullable, nonatomic, retain) Classes *studentClass;
    @property (nullable, nonatomic, retain) NSSet<Course *> *studentCourses;
    
    @end
    
    @interface Student (CoreDataGeneratedAccessors)
    
    - (void)addStudentCoursesObject:(Course *)value;
    - (void)removeStudentCoursesObject:(Course *)value;
    - (void)addStudentCourses:(NSSet<Course *> *)values;
    - (void)removeStudentCourses:(NSSet<Course *> *)values;
    
    @end
    
    NS_ASSUME_NONNULL_END

    4、简单使用

    - (void)viewDidLoad {
        [super viewDidLoad];
        NSLog(@"===%@",NSHomeDirectory());
    
        // Do any additional setup after loading the view, typically from a nib.
        self.delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
        
        [self addData];
    }
    //添加一条数据
    - (void)addData{
        Student *newEintity = [NSEntityDescription insertNewObjectForEntityForName:Model_Name inManagedObjectContext:self.delegate.persistentContainer.viewContext];
        newEintity.name = @"张三";
        newEintity.age = @"13";
        Classes *newClass = [[Classes alloc] initWithContext:self.delegate.persistentContainer.viewContext];
    //    newClass.class_id = @"13";
    //    newClass.class_name = @"高二";
        newEintity.studentClass = newClass;
        
        Course *newCourse = [[Course alloc] initWithContext:self.delegate.persistentContainer.viewContext];
    //    newCourse.courseId = 1;
    //    newCourse.courseName =@"语文";
    //    newCourse.chapterCount = 23;
        [newEintity addStudentCourses:[NSSet setWithObject:newCourse]];
        [self.delegate.persistentContainer.viewContext save:nil];
    }
  • 相关阅读:
    & 【04】 Spring中Xml属性配置的解析过程
    设计模式之模板方法设计模式
    MySQL高性能索引创建策略
    oracle用户创建及权限设置
    【已解决】关于SQL2008 “不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了‘阻止保存要求重新创建表的更改’” 解决方案
    ObjectStateManager 不包含具有对“Model”类型的对象的引用的 ObjectStateEntry
    【推荐活动】脚本娃娃同城会——上海站(20130112)
    【原创】对于访问IIS元数据库失败的解决(续)
    【原创】win7 plsql里查询出来的中文信息,复制粘贴的时候出现乱码(以前从没遇到过,第一次啊)
    oracle删除用户命令和部分命令
  • 原文地址:https://www.cnblogs.com/xianfeng-zhang/p/8301834.html
Copyright © 2011-2022 走看看