使用CoreData [2]
使用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":@},
@{@"name":@"张惠妹", @"age":@},
@{@"name":@"井冈山", @"age":@}];
[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;
}
附录:
如果想修改多对多,请以下图为参考

上图那么修改了之后就会变成下图所示的多对多了,一个学生也可以有好几个老师了.

以上就讲完了关系型数据:)
使用CoreData [2]的更多相关文章
- iOS基本数据库存储方式 - CoreData
CoreData 创建模型文件的过程 1.选择模板 2.添加实体 3.添加实体的属性[注意]属性的首字母必须小写 一.CoreData管理类(必备以下三个类对象) 1.CoreData数据操作的上下文 ...
- iOS CoreData 中 objectID 的不变性
关于 CoreData的 objectID 官方文档有这样的表述:新建的Object还没保存到持久化存储上,那么它的objectID是临时id,而保存之后,就是持久化的id,不会再变化了. 那么,我想 ...
- CoreData __ 基本原理
操作过程 Context想要获取值,先要告诉连接器,我要什么东西 链接器再告诉store, 你给我什么东西, store去找 找到之后返回给链接器,链接器再返回给Context Co ...
- iOS CoreData primitive accessor
Given an entity with an attribute firstName, Core Data automatically generates firstName, setFirstNa ...
- 初识CoreData与详解
Core Data数据持久化是对SQLite的一个升级,它是iOS集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类. (1)NSManagedObjectModel(被管 ...
- CoreData教程
网上关于CoreData的教程能搜到不少,但很多都是点到即止,真正实用的部分都没有讲到,而基本不需要的地方又讲了太多,所以我打算根据我的使用情况写这么一篇实用教程.内容将包括:创建entity.创建r ...
- CoreData和SQLite多线程访问时的线程安全
关于CoreData和SQLite多线程访问时的线程安全问题 数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常 ...
- IOS数据存储之CoreData使用优缺点
前言: 学习了Sqlite数据之后认真思考了一下,对于已经习惯使用orm数据库的开发者或者对sql语句小白的开发者来说该如何做好数据库开发呢?这个上网搜了一下?看来总李多虑了!apple 提供了一种数 ...
- iOS开发之表视图爱上CoreData
在接触到CoreData时,感觉就是苹果封装的一个ORM.CoreData负责在Model的实体和sqllite建立关联,数据模型的实体类就相当于Java中的JavaBean, 而CoreData的功 ...
- CoreData
之前在学习使用SQLite时, 需要编写大量的sql语句,完成数据的增删改查,但对于不熟悉sql语句的开发人员来说,难度较大,调试程序比较困难. 由此出现CoreData框架,将sql的操作转换成为对 ...
随机推荐
- redis集群与分片(2)-Redis Cluster集群的搭建与实践
Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Re ...
- [CTSC 2018]假面
Description 题库链接 有 \(n\) 个敌方单位,初始第 \(i\) 个单位的血量为 \(m_i\) .共 \(Q\) 次操作,分两种: 对某一个单位以 \(p\) 的概率造成 \(1\) ...
- HttpContext概念讲解
一:HttpContext理论知识: 1:HttpContext类它对Request.Respose.Server等等都进行了封装,并保证在整个请求周期内都可以随时随地的调用:为继承 IHttpMod ...
- setInterval与setTimeout的区别
在制作网页动态效果时,一定会遇到某些需求,要求某段程序等待多时时间后再开始执行,就像在我们的生活中一样,待会儿再开始做一件事.在JavaScript中主要通过定时器实现此类需求,本文将对定时器做一个概 ...
- 用PDMReader工具生成数据库设计文档(转载)
来源:http://blog.csdn.net/xinglun88/article/details/19987719 第一步:下载并安装PDMReader,资源网站: http://www.pdmre ...
- 设计模式学习--面向对象的5条设计原则之依赖倒置原则--DIP
一.DIP简介(DIP--Dependency Inversion Principle): 1.高层模块不应该依赖于低层模块,二者都应该依赖于抽象.2.抽象不应该依赖于细节,细节应该依赖于抽象. ...
- CSS3文本属性
text-shadow(文本阴影) <h1>我有文字阴影</h1> h1{ color:#ffff00; text-shadow:1px 2px 2px #000000; } ...
- 【JavaScript 从零开始】 原始值和对象引用、类型转换
JavaScript 中的原始值(undefined.null . 布尔值.数值和字符串)于对象(包括数组和函数)有着根本区别. 原始值是不可更改的:任何方法都无法改变(或“突变”)一个原始值. 对于 ...
- JSTL fn:split()函数
jstl fn:split()函数代码和用法 -使用fn:split() 函数将一个字符串到一个数组根据分隔符字符串的子字符串. 使用fn:split() 函数将一个字符串到一个数组根据分隔符字符串的 ...
- POJ1321(KB1-A 简单搜索)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 40872 Accepted: 19936 Description 在一 ...