使用CoreData [2]
此篇讲解CoreData处理关系型数据.
1. 先创建出Student于Teacher的实体.
2. 确定关系,并修改描述
3. 创建对象,并查看一下关系(Teacher与Student之间是有着关联关系的哦)
4. 测试代码.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSLog(@"%@", NSHomeDirectory()); // 创建老师的实体 Teacher *KongZi = [self createTeacher:@"KongZi"]; // 创建学生的实体并添加到老师的实体当中 NSArray *students = @[@{@"name":@"王力宏", @"age":@11}, @{@"name":@"张惠妹", @"age":@8}, @{@"name":@"井冈山", @"age":@10}]; [students enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { Student *student = [self createStudent:obj[@"name"] age:obj[@"age"]]; [KongZi addStudentsObject:student]; }]; // 存储信息 [self saveContext]; return YES; } - (Student *)createStudent:(NSString *)name age:(NSNumber *)age { // 实体描述信息 NSEntityDescription *description = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:[self managedObjectContext]]; // 初始化对象 Student *student = [[Student alloc] initWithEntity:description insertIntoManagedObjectContext:[self managedObjectContext]]; student.name = name; student.age = age; return student; } - (Teacher *)createTeacher:(NSString *)name { // 实体描述信息 NSEntityDescription *description = [NSEntityDescription entityForName:@"Teacher" inManagedObjectContext:[self managedObjectContext]]; // 初始化对象 Teacher *teacher = [[Teacher alloc] initWithEntity:description insertIntoManagedObjectContext:[self managedObjectContext]]; teacher.name = name; return teacher; }
5. 验证关系型数据
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSLog(@"%@", NSHomeDirectory()); // 设定要查询的实体 NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Teacher"]; // 取出查询结果 NSArray *teachers = [[self managedObjectContext] executeFetchRequest:fetch error:nil]; // 遍历出所有老师 [teachers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { Teacher *teacher = obj; // 获取该老师所有的学生 [[teacher students] enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { Student *student = obj; NSLog(@"%@ %@", student.age, student.name); Teacher *tmp = (Teacher *)student.teacher; NSLog(@"老师是: %@", tmp.name); }]; }]; return YES; }
*6. 验证存在两个老师的情形
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 本人意淫一回当老师 Teacher *YouXianMing = [self createTeacher:@"游贤明"]; // 设定要查询的实体 NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Teacher"]; // 取出查询结果 NSArray *teachers = [[self managedObjectContext] executeFetchRequest:fetch error:nil]; // 遍历出所有老师 [teachers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { Teacher *teacher = obj; // 获取该老师所有的学生 [[teacher students] enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { Student *student = obj; // 添加一个学生后就停止 [YouXianMing addStudentsObject:student]; *stop = YES; }]; }]; // 存储信息 [self saveContext]; return YES; }
执行上述代码之后在执行下述代码.
下图表明了这个原因:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 设定要查询的实体 NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Teacher"]; // 取出查询结果 NSArray *teachers = [[self managedObjectContext] executeFetchRequest:fetch error:nil]; // 遍历出所有老师 [teachers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { Teacher *teacher = obj; // 获取该老师所有的学生 [[teacher students] enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { Student *student = obj; Teacher *tmp = (Teacher *)student.teacher; NSLog(@"%@ %@", student.age, student.name); NSLog(@"老师是: %@", tmp.name); }]; }]; return YES; }
附录:
如果想修改多对多,请以下图为参考
上图那么修改了之后就会变成下图所示的多对多了,一个学生也可以有好几个老师了.
以上就讲完了关系型数据:)