使用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]的更多相关文章

  1. iOS基本数据库存储方式 - CoreData

    CoreData 创建模型文件的过程 1.选择模板 2.添加实体 3.添加实体的属性[注意]属性的首字母必须小写 一.CoreData管理类(必备以下三个类对象) 1.CoreData数据操作的上下文 ...

  2. iOS CoreData 中 objectID 的不变性

    关于 CoreData的 objectID 官方文档有这样的表述:新建的Object还没保存到持久化存储上,那么它的objectID是临时id,而保存之后,就是持久化的id,不会再变化了. 那么,我想 ...

  3. CoreData __ 基本原理

    操作过程 Context想要获取值,先要告诉连接器,我要什么东西 链接器再告诉store, 你给我什么东西, store去找 找到之后返回给链接器,链接器再返回给Context          Co ...

  4. iOS CoreData primitive accessor

    Given an entity with an attribute firstName, Core Data automatically generates firstName, setFirstNa ...

  5. 初识CoreData与详解

    Core Data数据持久化是对SQLite的一个升级,它是iOS集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类. (1)NSManagedObjectModel(被管 ...

  6. CoreData教程

    网上关于CoreData的教程能搜到不少,但很多都是点到即止,真正实用的部分都没有讲到,而基本不需要的地方又讲了太多,所以我打算根据我的使用情况写这么一篇实用教程.内容将包括:创建entity.创建r ...

  7. CoreData和SQLite多线程访问时的线程安全

    关于CoreData和SQLite多线程访问时的线程安全问题 数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常 ...

  8. IOS数据存储之CoreData使用优缺点

    前言: 学习了Sqlite数据之后认真思考了一下,对于已经习惯使用orm数据库的开发者或者对sql语句小白的开发者来说该如何做好数据库开发呢?这个上网搜了一下?看来总李多虑了!apple 提供了一种数 ...

  9. iOS开发之表视图爱上CoreData

    在接触到CoreData时,感觉就是苹果封装的一个ORM.CoreData负责在Model的实体和sqllite建立关联,数据模型的实体类就相当于Java中的JavaBean, 而CoreData的功 ...

  10. CoreData

    之前在学习使用SQLite时, 需要编写大量的sql语句,完成数据的增删改查,但对于不熟悉sql语句的开发人员来说,难度较大,调试程序比较困难. 由此出现CoreData框架,将sql的操作转换成为对 ...

随机推荐

  1. 理解Linux内核之中断控制

    乍一看下边的Linux内核代码,貌似L3389有bug,于是我就绕有兴趣地阅读了一下local_irq_save/local_irq_restore的源代码. /* linux-4.14.12/mm/ ...

  2. Shiro的Filter机制详解---源码分析

    Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). ...

  3. Nodejs学习笔记(十七)—浮点运算decimal.js

    前言 开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰 JavaScript 只有一种数字类型 ( Number ) JavaScript采用 IEEE 754 标准双 ...

  4. CentOS探索之路3---安装python3

    安装Python3 总述 ​ 一般来说Linux类型的操作系统都会自带安装python,但是系统默认安装的python都是2.x的版本.而现在一般使用的是python3.x版本,相比于python2. ...

  5. JAVA-5NIO之Selector

    转载:并发编程网:ifeve.com NIO教程 Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理 ...

  6. Docker run centos 中文乱码,时区不对 问题解决

    开心得写代码,结果用Docker部署发现中文全是问号... 调了半天编码,最后发现不是代码得问题..坑爹.. dokcer 的 centos镜像不带中文,时区也不是中国,所以要自己设置.. #设置时区 ...

  7. [转]9.2.3 .net core 通过TagHelper封装控件

    本文转自:https://www.cnblogs.com/BenDan2002/p/6170624.html .net core 除了继续保留.net framework的HtmlHelper的写法以 ...

  8. SQL Server提取字段中的所有数字

    今天公司项目中遇到了一个需求,要求提取用户电话号码字段中的所有电话信息. 由于该字段在项目最初设计中没有严格控制数据质量,导致用户在输入时包含了很多非电话的信息,如用户名字等(136 **** *** ...

  9. jade——创建第一个jade模板

    什么是jade? jade是node.js的一个模板引擎,参考了haml的语法,是简写的html语言. 使用单个标签代替双标签,类似于Python,通过缩进来确定从属关系,没有结束符号,非常简洁,使用 ...

  10. Head First Python学习笔记3——持久存储

    经过上几章的学习,完成如下任务:读取一个文本文件里的内容,将每一行的内容按“:”分割成两部分,根据分割出第一项判断并分别放入两个列表里,去除首尾空白,在屏幕上打印. # 两个列表用于存储数据man=[ ...