使用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的操作转换成为对 ...
随机推荐
- ssh和ssh-copy-id以及批量多机无密码登陆详解
本文主要围绕着ssh服务以及如何通过ssh-copy-id实现无密码登陆. 1. sshd 服务以及配置 2.ssh-copy-id命令的使用以及原理.3.批量多机互相信任. 1. sshd 服务 ...
- ibatis SQLmap mysql模糊查询字符串拼的三种方法
在通常情况下iBATIS的参数在sqlmap中使用#param#的形式,参数名以’#’包着,但当使用sql的LIKE语句时就发生了问题,在单引号中无法使用#param#这种形式,下面列举出了3种方法来 ...
- 安装ftp服务
1.首先判断你服务器上是否安装了vsftpd 2.安装vsftpd 3.配置文件/etc/vsftpd/vsftpd.conf 禁止匿名用户登录,把YES改为NO,默认为YES 限制ftp用户跳出家目 ...
- javascript 单双引号(转载)
来源:http://blog.csdn.net/irxiang/article/details/50164945 最近在使用javascript编程,遇到使用字符串的情况 写了一点测试代码 var s ...
- 转载:sql用逗号连接多张表对应哪个join?
http://blog.csdn.net/huanghanqian/article/details/52847835 四种join的区别已老生常谈: INNER JOIN(也可简写为JOIN): 如果 ...
- SDWebImage实现图片展示、缓存、清除缓存
1. /* 图片显示 */ [self.imageView sd_setImageWithURL:[NSURL URLWithString:urlString]]; [s ...
- Django(四):model
一.创建model django.db.models是django自带的创建数据库的ORM. 在models.py中以继承models.Model创建表后,需要在setttngs中确保添加了当前应用, ...
- js this问题和es6箭头函数this问题
JS中this的四种用法 1.在一般函数方法中使用 this 指代全局对象 function test(){ this.x = 1; alert(this.x); } test(); //1 2.作为 ...
- Python 正则 re.sub替换
# 正则将匹配到的两个字段,都替换成某个值import re s0 = 'BOY and GIRL' s1 = re.sub(r'BOY|GIRL', 'HUMAN', s0) print s1 # ...
- 使用Keras进行多GPU训练 multi_gpu_model
使用Keras训练具有多个GPU的深度神经网络(照片来源:Nor-Tech.com). 摘要 在今天的博客文章中,我们学习了如何使用多个GPU来训练基于Keras的深度神经网络. 使用多个GPU使我们 ...