在上篇文章中,笔者写了如何建立Core Data项目,以及建立数据模型,没有阅读的小伙伴请移步,先了解一下相关内容吧: [ [iOS]Core Data浅析(一) ](https://segmentfault.com/a/11... ;
今天,咱们来讨论,如何将建立的可视化模型,转化为OC的对象模型.
接着咱们上一个工程继续操做;segmentfault
来到咱们的LZCoreData.xcdatamodeld文件,选中PeopleEntity实体,而后点击Xcode导航栏的File-->New -->File...或者直接command+N,新建文件,选择Core Data-->NSManagedObject subclassoop
Next-->Next.来到以下界面:fetch
这里会显示项目中全部待转化为模型的实体列表,选择你要转化的实体,继续Next-->Create;
这时,项目的左侧导航会多了几个文件:spa
就是分别为PeopleEntit和ManEntity建立的模型文件,这里咱们主要用到的是那四个名称比较长的类目文件;
这里有一个问题,须要咱们手动处理一下:代理
比较这两个类目文件,咱们会发现,在PeopleEntity+CoreDataProperties.h文件中的manRelationship属性被声明为了NSManagedObject类型,而咱们建立的模型中这个属性类型是ManEntity,这是不对的;而在ManEntity+CoreDataProperties.h文件中的peopleRelationship是PeopleEntity类型的,是正确的;这是由于在生成PeopleEntity的模型的时候ManEntity的模型并不存在,因此系统不知道有这个类型,就直接声明为NSManagedObject类型;而在生成ManEntity的模型的时候,PeopleEntity的模型已经存在了,因此他的属性声明是正常的;
这时,只须要咱们手动改一下PeopleEntity+CoreDataProperties.h的属性manRelationship的类型为ManEntity便可;code
改完后,一编译发现报错了,这是由于缺乏对ManEntity的引用,这里咱们并不须要直接访问ManEntity的属性,因此只须要在PeopleEntity.h中加上:对象
@class ManEntity;
再编译,就没有问题了;ip
模型转化完成,就能够在咱们的代码中使用了,
来到咱们的ViewController.m
文件,
导入头文件PeopleEntity+CoreDataProperties.h
和ManEntity+CoreDataProperties.h
,
并修改成如下代码:rem
//获取代理 AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; //获取context NSManagedObjectContext *context = [delegate managedObjectContext]; //获取PeopleEntity实体 //这里修改成PeopleEntity类型 PeopleEntity *people = [NSEntityDescription insertNewObjectForEntityForName:@"PeopleEntity" inManagedObjectContext:context]; //设置属性内容 people.name = @"流火绯瞳"; people.age = @27; people.sex = @0; // [people setValue:@"流火绯瞳" forKey:@"name"]; // [people setValue:@26 forKey:@"age"]; // [people setValue:@0 forKey:@"sex"]; //获取ManEntit实体 //这里修改成ManEntity类型 ManEntity *man = [NSEntityDescription insertNewObjectForEntityForName:@"ManEntity" inManagedObjectContext:context]; man.height = @178.0; man.weight = @60.0; man.name = @"张三丰"; man.peopleRelationship = people; // [man setValue:@178.0 forKey:@"height"]; // [man setValue:@60.0 forKey:@"weight"]; // [man setValue:@"张三" forKey:@"name"]; // [man setValue:people forKey:@"peopleRelationship"]; // // [people setValue:man forKey:@"manRelationship"]; people.manRelationship = man; NSError *error; //保存更改 if ([context save:&error]) { NSLog(@"保存成功"); } else { NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); } //查询实体 //建立一个查询请求 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; //获取要查询的实体 NSEntityDescription *entity = [NSEntityDescription entityForName:@"PeopleEntity" inManagedObjectContext:context]; //添加到查询请求 [fetchRequest setEntity:entity]; //开始查询并获取结果 NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; NSLog(@"输出查询结果"); for (PeopleEntity *info in fetchedObjects) { NSLog(@"Name: %@", info.name); NSLog(@"age: %@", info.age); NSLog(@"sex: %@", info.sex); NSLog(@"-----------------------------------"); // NSLog(@"Name: %@", [info valueForKey:@"name"]); // NSLog(@"age: %@", [info valueForKey:@"age"]); // NSLog(@"sex: %@", [info valueForKey:@"sex"]); // NSLog(@"-----------------------------------"); ManEntity *man1 = [info valueForKey:@"manRelationship"]; NSLog(@"Name: %@", man1.name); NSLog(@"weight: %@", man1.weight); NSLog(@"height: %@", man1.height); NSLog(@"=========================================="); // NSLog(@"Name: %@", [man1 valueForKey:@"name"]); // NSLog(@"weight: %@", [man1 valueForKey:@"weight"]); // NSLog(@"height: %@", [man1 valueForKey:@"height"]); // NSLog(@"=========================================="); }
为了便于比较先后作了哪些更改,这里我没有把原来的KVC模式赋值取值方法删除,只是注释掉了;并添加了咱们熟悉的对象属性赋值取值方式;
运行一下看看结果吧:get
2016-05-26 16:22:27.286 LZCoreData[5765:594436] 保存成功 2016-05-26 16:22:27.288 LZCoreData[5765:594436] 输出查询结果 2016-05-26 16:22:27.288 LZCoreData[5765:594436] Name: 流火绯瞳 2016-05-26 16:22:27.288 LZCoreData[5765:594436] age: 26 2016-05-26 16:22:27.288 LZCoreData[5765:594436] sex: 0 2016-05-26 16:22:27.288 LZCoreData[5765:594436] ----------------------------------- 2016-05-26 16:22:27.289 LZCoreData[5765:594436] Name: 张三 2016-05-26 16:22:27.289 LZCoreData[5765:594436] weight: 60 2016-05-26 16:22:27.289 LZCoreData[5765:594436] height: 178 2016-05-26 16:22:27.290 LZCoreData[5765:594436] ========================================== 2016-05-26 16:22:27.290 LZCoreData[5765:594436] Name: 流火绯瞳 2016-05-26 16:22:27.290 LZCoreData[5765:594436] age: 27 2016-05-26 16:22:27.290 LZCoreData[5765:594436] sex: 0 2016-05-26 16:22:27.290 LZCoreData[5765:594436] ----------------------------------- 2016-05-26 16:22:27.290 LZCoreData[5765:594436] Name: 张三丰 2016-05-26 16:22:27.290 LZCoreData[5765:594436] weight: 60 2016-05-26 16:22:27.290 LZCoreData[5765:594436] height: 178 2016-05-26 16:22:27.308 LZCoreData[5765:594436] ==========================================
什么?有两组数据!! 若是你是接着上篇文章作的,这里固然会输出两组数据,由于咱们保存了两次数据嘛.由可视化的模型转化为对象模型到这里就完成了,而后就能够在项目中使用了.固然,到目前为止,咱们只是介绍了Core Data的使用准备工做,真正使用的话,咱们须要完善他的增删改查功能;