使用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. Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法

    什么是ApplicationContext? 它是spring的核心,Context我们通常解释为上下文环境,但是理解成容器会更好些. ApplicationContext则是应用的容器. Sprin ...

  2. SVN 基本的工作循环

    基本的工作循环 Subversion有许多特性.选项和华而不实的高级功能,但日常的工作中你只使用其中的一小部分,在这一节里,我们会介绍许多你在日常工作中常用的命令. 典型的工作周期是这样的: 更新你的 ...

  3. redis实战笔记(6)-第6章 使用 Redis构建应用程序组件

    本章主要内容   1.构建两个前缀匹配自 动补全程序 2.通过构建分布式锁来提高性能 3.通过开发计数信号量来控制并发 4.构建两个不同用途的任务队列 5.通过消息拉取系统来实现延迟消息传递 6.学习 ...

  4. antlr提取代码注释

    1. 来由 为什么要写提取注释呢,起因是工作需要.弄这么个不太重要的功能点来讲,旨在抛砖引玉. 一般而言,大家使用antlr解析源代码的时候,不会关心注释和空格之类内容,默认会过滤掉,不会放到语法树里 ...

  5. 一个基于Socket的http请求监听程序实现

    首先来看以下我们的需求: 用java编写一个监听程序,监听指定的端口,通过浏览器如http://localhost:7777来访问时,可以把请求到的内容记录下来,记录可以存文件,sqlit,mysql ...

  6. rails 国际化、validate校验、flash提示

      1.Rails的国际化 根据特定的locale信息,提取相应的内容 通过config/environment.rb,指定应用的转换文件 config.i18n.load_path +=Dir[Ra ...

  7. mysql sql语句大全(MySQL语句 整理一)

    1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...

  8. spring jpa和mybatis整合

    spring jpa和mybatis整合 前一阵子接手了一个使用SpringBoot 和spring-data-jpa开发的项目 后期新加入一个小伙伴,表示jpa相比mybatis太难用,多表联合的查 ...

  9. spring boot 报错 Failed to read HTTP message

    2008-12-13 15:06:03,930 WARN (DefaultHandlerExceptionResolver.java:384)- Failed to read HTTP message ...

  10. 高并发第十一弹:J.U.C -AQS(AbstractQueuedSynchronizer) 组件:Lock,ReentrantLock,ReentrantReadWriteLock,StampedLock

    既然说到J.U.C 的AQS(AbstractQueuedSynchronizer)   不说 Lock 是不可能的.不过实话来说,一般 JKD8 以后我一般都不用Lock了.毕竟sychronize ...