[iOS]Core Data浅析二 -- 转换实体(Entity)为模型对象

Core Data系列文章:
[iOS]Core Data浅析一 -- 启用Core Data
[iOS]Core Data浅析二 -- 转换实体(Entity)为模型对象
[iOS]Core Data浅析三 -- 数据的增删改查
以及一个, 在新版Xcode中使用的注意事项:
[Core Data]Xcode 8+ 新建NSManageObject subclass方法

在上篇文章中,笔者写了如何创建Core Data项目,以及创建数据模型,没有阅读的小伙伴请移步,先了解一下相关内容吧[iOS]Core Data浅析(一);
今天,我们来讨论,如何将创建的可视化模型,转化为OC的对象模型.
接着我们上一个工程继续操作;

一. 转化为对象模型

来到我们的LZCoreData.xcdatamodeld文件,选中PeopleEntity实体,然后点击Xcode导航栏的File-->New -->File...或者直接command+N,新建文件,选择Core Data-->NSManagedObject subclass

选择NSManagedObject subclass

Next-->Next.来到如下界面:

选择实体

这里会显示项目中所有待转化为模型的实体列表,选择你要转化的实体,继续Next-->Create;
这时,项目的左侧导航会多了几个文件:

新建的模型文件

就是分别为PeopleEntit和ManEntity创建的模型文件,这里我们主要用到的是那四个名称比较长的类目文件;
这里有一个问题,需要我们手动处理一下:

比较这两个类目文件,我们会发现,在PeopleEntity+CoreDataProperties.h文件中的manRelationship属性被声明为了NSManagedObject类型,而我们创建的模型中这个属性类型是ManEntity,这是不对的;而在ManEntity+CoreDataProperties.h文件中的peopleRelationship是PeopleEntity类型的,是正确的;这是因为在生成PeopleEntity的模型的时候ManEntity的模型并不存在,所以系统不知道有这个类型,就直接声明为NSManagedObject类型;而在生成ManEntity的模型的时候,PeopleEntity的模型已经存在了,所以他的属性声明是正常的;
这时,只需要我们手动改一下PeopleEntity+CoreDataProperties.h的属性manRelationship的类型为ManEntity即可;

改完后,一编译发现报错了,这是因为缺少对ManEntity的引用,这里我们并不需要直接访问ManEntity的属性,所以只需要在PeopleEntity.h中加上:

@class ManEntity;

再编译,就没有问题了;

二. 使用对象模型

模型转化完成,就可以在我们的代码中使用了,
来到我们的ViewController.m文件,
导入头文件PeopleEntity+CoreDataProperties.h
ManEntity+CoreDataProperties.h,
并修改为以下代码:

//获取代理
    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模式赋值取值方法删除,只是注释掉了;并添加了我们熟悉的对象属性赋值取值方式;
运行一下看看结果吧:

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的使用准备工作,真正使用的话,我们需要完善他的增删改查功能;这些,推荐一篇文章 IOS之分析网易新闻存储数据(CoreData的使用,增删改查).

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容