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*)fetchRequest;@property (nullable, nonatomic, copy) NSString *age;@property (nullable, nonatomic, copy) NSString *name;@property (nullable, nonatomic, retain) Classes *studentClass;@property (nullable, nonatomic, retain) NSSet *studentCourses;@end@interface Student (CoreDataGeneratedAccessors)- (void)addStudentCoursesObject:(Course *)value;- (void)removeStudentCoursesObject:(Course *)value;- (void)addStudentCourses:(NSSet *)values;- (void)removeStudentCourses:(NSSet *)values;@endNS_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];}