Coredata第二课 实体间的关系

问题

如果多个实体之间有关联,比如Student拥有多本书(Book),怎么像数据库一样的能够表示这种关系?

解决方法

Core Data提供了relationship来表示实体(Entity)之间的这种关系,包括一对一、一对多等。

1 .打开Core Data的模型文件,可以看到每个Entity都有一个Relationships可以设置。我们在Student里面添加一个books属性,并将它的类型(Type)设置为To Many(一对多)。 

2 .给Books添加一个owner属性,并将Inverse设为books。这样的话,只要将book对象添加到Studentbooks中,就会自动将owner属性指向该Student对象。通过改变实体的展示样式能够让我们看的更加清楚。

3 .通过“Editor > NSManagedObject Subclass...”创建两个实体所对应的类。

Book:

@interface Book : NSManagedObject

@property (nonatomic, retain) NSString * title;
@property (nonatomic) float price;
@property (nonatomic, retain) Student *owner;

@end

Student:

@interface Student : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic) int32_t age;
@property (nonatomic, retain) NSOrderedSet *books;
@end

@interface Student (CoreDataGeneratedAccessors)

//没有实现
- (void)insertObject:(Book *)value inBooksAtIndex:(NSUInteger)idx;
- (void)removeObjectFromBooksAtIndex:(NSUInteger)idx;
- (void)insertBooks:(NSArray *)value atIndexes:(NSIndexSet *)indexes;
- (void)removeBooksAtIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectInBooksAtIndex:(NSUInteger)idx withObject:(Book *)value;
- (void)replaceBooksAtIndexes:(NSIndexSet *)indexes withBooks:(NSArray *)values;
- (void)addBooksObject:(Book *)value;
- (void)removeBooksObject:(Book *)value;
- (void)addBooks:(NSOrderedSet *)values;
- (void)removeBooks:(NSOrderedSet *)values;
@end

Student是通过一个NSOrderdSet来表示一对多的关系的。这里之所以没有使用数组是因为需要保证数据的唯一性。我们还需要注意的是,在Student类中生成了许多管理Book的方法,但是这些方法都是没有实现的。比如我们需要添加一个增加Book的功能,就需要实现addBooksObject:

- (void)addBooksObject:(Book *)value {
    NSMutableOrderedSet *books = [self.books mutableCopy];
    [books addObject:value];
    self.books = books;
}

4 .保存Student对象与Book对象。

NSManagedObjectContext *context = [AppDelegate appDelegate].managedObjectContext;

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context];
//创建Student对象
Student *stu = [[Student alloc] initWithEntity:entity insertIntoManagedObjectContext:context];

int r = arc4random_uniform(1000);
stu.name = [NSString stringWithFormat:@"Zhangsan: %d", r];

NSEntityDescription *bEntity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context];
//创建Book对象
Book *book = [[Book alloc] initWithEntity:bEntity insertIntoManagedObjectContext:context];
book.title = @"红楼梦";
//添加Book对象
[stu addBooksObject:book];

//保存Student对象
[context insertObject:stu];
[context save:nil];

5 .查询Student对象,并通过打印查看是否保存了Book,并且能否通过book.owner得到它与Student对象的关系。

NSManagedObjectContext *context = [AppDelegate appDelegate].managedObjectContext;

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
NSArray *arr = [context executeFetchRequest:request error:nil];
for (Student *stu in arr) {
    NSLog(@"Name: %@", stu.name);
    for (Book *b in stu.books) {
        NSLog(@"Book: %@ -> %@", b.title, b.owner);
    }
}

6 .从结果可以看到,b.owner确实指向了一个Student对象。

2015-02-04 09:07:43.391 02-03-CoreDataRelationship[5169:235934] Name: Zhangsan: 333
2015-02-04 09:07:43.394 02-03-CoreDataRelationship[5169:235934] Book: 红楼梦 -> <Student: 0x7f9720d48bd0> (entity: Student; id: 0xd000000000040000 <x-coredata://C07E5BAC-C3F6-44B6-B21C-C3D3FBFA4ED1/Student/p1> ; data: {
    age = 0;
    books =     (
        "0xd000000000040002 <x-coredata://C07E5BAC-C3F6-44B6-B21C-C3D3FBFA4ED1/Book/p1>"
    );
    name = "Zhangsan: 333";
})

7 .总的来说Core Data自动替我们管理了实体(对象)之间的依赖关系,能够省去不少代码。

本文档由长沙戴维营教育整理。

时间: 2024-10-10 13:35:49

Coredata第二课 实体间的关系的相关文章

序列化后的json串与解析json串实体间的关系

一般用一个实体去解析一个json串通常会存在以下几种情况: 1.序列化成json的实体属性多于解析json串的实体属性. 2.解析json串的实体属性多于序列化成json的实体属性. 3.序列化成json串的实体类与解析json串的实体类名字不一致. 4.序列化成json串的实体的属性跟解析json串实体属性类型不一致,但名字一致. 5.是否任意一个实体都可以解析json串. 以下是实验的例子: 1.序列化成json的实体属性多于解析json串的实体属性. 这是序列化成json的实体类型. pu

ASP.NET Web API基于OData的增删改查,以及处理实体间关系

本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先是比较典型的一对多关系,Supplier和Product. public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Category { get; set; } [ForeignKey("Sup

数据库 实体间的3种关系

数据库实体间有三种对应关系:一对一,一对多,多对多.一对一关系示例:一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号.一对多关系示例:一个学生只属于一个班,但是一个学院有多名学生.多对多关系示例:一个学生可以选择多门课,一门课也有多名学生. 这三种关系在数据库中逻辑结构处理分析: 1.一对多关系处理:我们以学生和班级之间的关系来说明一对多的关系处理方法.假设现有基本表学生表(学号,姓名,……),班级表(班级号,备注信息,……).                方法一:新增一个关系表,

管理者的角色修炼-第二课总结

一.前言 第二课历时两天,主要讲了团队从招人到高绩效的各个阶段的特征,有什么问题,如何解决!结合我自己的亲身经历,反思后印证着去看,还是很有收获. 二.开场的一件小事 第二课换了一个有着男性名字的女老师,其实大家对老师的男女没什么太多的想法.但老师在开场做自我介绍后,大家对其的第一印象和行为就出现了比第一课老师不一样的东西. 问题就出在这个自我介绍上.老师介绍完的自己的名字后,说其有20多年的工作经验了:08年之前在一个外企工作,这中间,正好遇上了奥运会需要培训3000名员工和志愿者:这之后,跳

【Cocos游戏实战】功夫小子第二课之基础类分析和实现

本节课的视频教程地址是:第二课在此 如果本教程有帮助带您,希望您能点击进去观看一下,而且现在注册成为极客学院的会员,验证手机号码和邮箱号码会赠送三天的会员时间,会员可以无限制的下载和观看所有的视频,谢谢您的支持! 在开始第二节课之前,这里需要声明的是, 首先:本系列课程是为了结合Cocos2d-x 3.x 的基本组件和核心模块的学习而制作的,开发所使用的版本是3.0,但是代码稍加修改就可以运用在3.X的其他版本上. 其次:本游戏项目是一个非商业化项目,游戏资源和代码都会在后续的课程中释放出来,供

ThinkPHP第二课 框架MVC目录和URL访问方式

第二课 框架MVC目录和URL访问方式 1.说明: ThinkPHP是基于MVC的框架,认识框架目录将更好的实现分层,掌握ThinkPHP.URL访问就是访问框架的控制器(MVC中的C),共有四种方式,框架中的C起到分模块的作用. url的4种访问方式: 1.PATHINFO 模式 -- 重点!!!!!! http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2 2.普通模式 http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2

《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型 (转)

第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以跳过本章. 本章将带你漫游使用实体框架建模的基本实例,建模是实体框架的核心特性,同时也是区别实体框架和微软早期的数据访问平台的特性.一旦建好模,你就可以面向模型编写代码,而不用面向关系数据库中的行和列. 本章以创建一个简单概念模型的实例开始,然后让实体框架创建底层的数据库,剩下的实例,将向你展示,如

【C语言探索之旅】 第二部分第二课:进击的指针,C语言的王牌!

内容简介 1.课程大纲 2.第二部分第二课: 进击的指针,C语言的王牌 3.第二部分第三课预告: 数组 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型

【自动语音识别课程】第二课 语音信号分析

[传送门] [自动语音识别课程]第一课 统计语音识别介绍 原文地址:http://blog.csdn.net/joey_su/article/details/36414877 转载请注明出处,欢迎交流. 概述 针对ASR的语音信号分析 特征 频谱分析 倒谱分析 标准特征:MFCC和PLP分析 动态特征 第一课的结尾提到了语音识别的框图,下图展示了信号分析技术在语音识别系统中的位置: 我们先来认识下语音的产生过程: 语音是在发音器官和声道共同作用下产生的.说话时,声带振动发出具有一定周期特性(基音