http://blog.csdn.net/fengsh998/article/details/8123392

iOS CoreData中,多表查询上相对来说,没有SQL直观,但COREDATA的功能还是可以完成相关操作的。

多表查询,表与表之间肯定存在某种关系,如果对于类似外连接,左连接等操作,在COREDATA中就显得无力(请高手指教了)。

在上节中,介绍了一下数据库的关系查询操作。

下面使用CoreData进行关系数据库的表与表之间的关系演示。

生成COREDATA和如何设置关系就不再详谈了,见之前的文章。

建立好的关系图:

一步步建立上面关系图:

先建立部门表,员工表,职位表,工资等级表,开户银行表

上面建立表之后,我们还需要建立表之间的关系

部门和员工之间的关系:1 V  N

部门和职位的关系:1  V  N

员工与职位的关系:多对一关系

员工与开户行:一个员工只能提供一个开户行,但一个开户行可以给多名员工进行开卡。所以关系为N V 1;

职位和工资等级:一个职位只对应一个工资等级;1V1

下面插入测试数据:

- (IBAction)onbtnclick:(id)sender
{
    Department *dept = [NSEntityDescription insertNewObjectForEntityForName:@"Department" inManagedObjectContext:self.managedObjectContext];
    dept.dp_deptname = @"HR";
    
    Department *dept2 = [NSEntityDescription insertNewObjectForEntityForName:@"Department" inManagedObjectContext:self.managedObjectContext];

dept2.dp_deptname = @"DEV";
    
    Department *dept3 = [NSEntityDescription insertNewObjectForEntityForName:@"Department" inManagedObjectContext:self.managedObjectContext];
    dept3.dp_deptname = @"POD";
    
    
    Salary *sy =[NSEntityDescription insertNewObjectForEntityForName:@"Salary" inManagedObjectContext:self.managedObjectContext];
    sy.sy_level = @"D";
    sy.sy_scale = [NSNumber numberWithDouble:0.1];
    
    Salary *sy2 =[NSEntityDescription insertNewObjectForEntityForName:@"Salary" inManagedObjectContext:self.managedObjectContext];
    sy2.sy_level = @"C";
    sy2.sy_scale = [NSNumber numberWithDouble:0.15];
    
    Salary *sy3 =[NSEntityDescription insertNewObjectForEntityForName:@"Salary" inManagedObjectContext:self.managedObjectContext];
    sy3.sy_level = @"B";
    sy3.sy_scale = [NSNumber numberWithDouble:0.4];
    
    Salary *sy4 =[NSEntityDescription insertNewObjectForEntityForName:@"Salary" inManagedObjectContext:self.managedObjectContext];
    sy4.sy_level = @"A";
    sy4.sy_scale = [NSNumber numberWithDouble:0.8];
    
    Post *pt= [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:self.managedObjectContext];
    pt.pt_name = @"行政专员";
    pt.dept = dept;
    
    Post *pt2= [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:self.managedObjectContext];    
    pt2.salary = sy3;
    pt2.pt_name = @"人事经理";
    pt2.dept = dept;
    
    Post *pt3= [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:self.managedObjectContext];
    pt3.pt_name = @"开发工程师";
    pt3.dept = dept2;
    pt3.salary = sy2;
    
    pt= [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:self.managedObjectContext];
    pt.pt_name = @"架构师";
    pt.dept = dept2;
    
    pt= [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:self.managedObjectContext];    
    pt.pt_name = @"项目经理";
    pt.dept =dept2;
    
    Post *pt6= [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:self.managedObjectContext];    
    pt6.pt_name = @"测试工程师";
    pt6.dept = dept2;
    pt6.salary = sy;
    
    pt= [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:self.managedObjectContext];
    pt.pt_name = @"销售代表";
    pt.dept = dept3;
    
    pt= [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:self.managedObjectContext];
    pt.pt_name = @"销售经理";
    pt.dept = dept3;
    
    Post *pt9= [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:self.managedObjectContext];
    pt9.pt_name = @"大客户经理";
    pt9.dept = dept3;
    pt9.salary = sy4;
    
    
    Bank *bk = [NSEntityDescription insertNewObjectForEntityForName:@"Bank" inManagedObjectContext:self.managedObjectContext];
    bk.bk_name = @"招行";
    bk.bk_address = @"广州";
    
    Bank *bk2 = [NSEntityDescription insertNewObjectForEntityForName:@"Bank" inManagedObjectContext:self.managedObjectContext];
    bk2.bk_name = @"浦发";
    bk2.bk_address = @"上海";
    
    Bank *bk3 = [NSEntityDescription insertNewObjectForEntityForName:@"Bank" inManagedObjectContext:self.managedObjectContext];
    bk3.bk_name = @"工行";
    bk3.bk_address = @"深圳";
    
    Employee *em = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.managedObjectContext];
    em.em_age = [NSNumber numberWithInt:20];
    em.em_name = @"张三";
    em.em_sex = [NSNumber numberWithInt:1];
    em.em_bankcardid = @"46326587439043";
    em.dept = dept2;
    em.post = pt3;
    em.bank = bk2;
    
    em = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.managedObjectContext];
    em.em_age = [NSNumber numberWithInt:18];
    em.em_name = @"李四";
    em.em_sex = [NSNumber numberWithInt:2];
    em.em_bankcardid = @"32565443246567";
    em.dept = dept;
    em.post = pt2;
    em.bank = bk3;
    
    em = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.managedObjectContext];

em.em_age = [NSNumber numberWithInt:26];
    em.em_name = @"欧阳";
    em.em_sex = [NSNumber numberWithInt:2];
    em.em_bankcardid = @"14354654656767";
    em.dept = dept3;
    em.post = pt9;
    em.bank = bk3;
    
    em = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.managedObjectContext];
    em.em_age = [NSNumber numberWithInt:22];
    em.em_name = @"欧阳";
    em.em_sex = [NSNumber numberWithInt:2];
    em.em_bankcardid = @"9873429837433";
    em.dept = dept2;
    em.post = pt6;
    em.bank = bk3;
    
    [self.managedObjectContext save:nil];
}

数据库中数据:

1、查询开发部门中名为张三的工资等级

NSEntityDescription * emEty = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext];
    NSFetchRequest *frq = [[[NSFetchRequest alloc]init]autorelease];
    
    [frq setEntity:emEty];
    
    NSPredicate * cdt = [NSPredicate predicateWithFormat:@"em_name = %@",@"张三"];
    
    [frq setPredicate:cdt];
    
    NSArray *objs =[self.managedObjectContext executeFetchRequest:frq error:nil];
    
    //NSLog(@"%i",[objs count]);
    NSLog(@"%@",((Employee*)[objs objectAtIndex:0]).post.salary.sy_level);

2、查询运维部名为欧阳的工资等级及开户银行

 NSEntityDescription * entity = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext];
    NSFetchRequest *fetch = [[[NSFetchRequest alloc]init]autorelease];
    
    [fetch setEntity:entity];
    
    NSPredicate * qcmd = [NSPredicate predicateWithFormat:@"em_name = %@ ",@"欧阳"];
    
    [fetch setPredicate:qcmd];
    
    NSArray * obs = [self.managedObjectContext executeFetchRequest:fetch error:nil];
    
    NSPredicate * filter = [NSPredicate predicateWithFormat:@"dept.dp_deptname = %@",@"POD"];
    
    NSArray * ret = [obs filteredArrayUsingPredicate:filter];  //从数组中进行过滤。
    
    NSLog(@"%@",((Employee*)[ret objectAtIndex:0]).post.salary.sy_level);

多表查询主要就在于表之间建立好相关的关联关系(relationship),其次就是充分的使用NSPredicate 这个查询条件来进行过滤。

IOS CoreData 多表查询(下)的更多相关文章

  1. IOS CoreData 多表查询demo解析

    在IOS CoreData中,多表查询上相对来说,没有SQL直观,但CoreData的功能还是可以完成相关操作的. 下面使用CoreData进行关系数据库的表与表之间的关系演示.生成CoreData和 ...

  2. ORM多表查询下

    一.多表查询 1.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接 ...

  3. Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉载入实现!)

    上一节我们实现了数据表的载入,可是,当数据表数据非常多时.我们就要考虑数据的分页.这里我们选用了PullToRefreshListView控件,先看一下该控件的说明: 效果图:            ...

  4. mysql 查询优化 ~ 多表查询改写思路

    一 简介:在之前我们从基础可知,现在咱们聊一下改写的几种思路二 分类:  1 left join  2 inner join  3 right join三 具体改写思路:思路1 本身不包含子查询,将多 ...

  5. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  6. $Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)

    自定义第三张表的好处:可以定义多个字段, 缺点:查询不方便(有方法解决) 1.第三张表设置外键,联合唯一(查询不方便) class Books(models.Model): name=models.C ...

  7. day056-58 django多表增加和查询基于对象和基于双下划线的多表查询聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁

    一.多表的创建 from django.db import models # Create your models here. class Author(models.Model): id = mod ...

  8. django之 基于queryset和双下划线的跨表查询

    前面篇随笔写的是基于对象的跨表查询:对象.objects.filter(...)  对象.关联对象_set.all(...)  -->反向 基于对象的跨表查询例如: book_obj= Book ...

  9. python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)

    昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...

随机推荐

  1. jquery中的$.ajax()的源码分析

    针对获取到location.href的兼容代码: try { ajaxLocation = location.href; } catch( e ) { // Use the href attribut ...

  2. win32 API中GetSystemMetrics函数

    1. SM_ARRANGE: 用于说明系统如何安排最小化窗口,根据显示器的不同系统数据可能有所不同.其包含一个起始位置和方向.关于在程序中怎么使用我还没有见个这样的代码. 起始位置可为下列值之一: A ...

  3. Android开发中,那些让你觉得相见恨晚的方法、类或接口

    Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[],而在StackTraceElement类中有四个方 ...

  4. 文本情感分析(一):基于词袋模型(VSM、LSA、n-gram)的文本表示

    现在自然语言处理用深度学习做的比较多,我还没试过用传统的监督学习方法做分类器,比如SVM.Xgboost.随机森林,来训练模型.因此,用Kaggle上经典的电影评论情感分析题,来学习如何用传统机器学习 ...

  5. 洛谷P4768 [NOI2018]归程(克鲁斯卡尔重构树+最短路)

    传送门 前置技能,克鲁斯卡尔重构树 我们按道路的高度建一个最大生成树,然后建好克鲁斯卡尔重构树 那么我们需要知道一颗子树内到1点距离最近是多少(除此之外到子树内任何一个点都不需要代价) 可以一开始直接 ...

  6. PJzhang:安全小课堂-安全软件为什么很重要,看这里!

    猫宁!!! 参考链接: http://www.360.cn/webzhuanti/mianyigongju.html https://www.freebuf.com/fevents/204100.ht ...

  7. Django + Vue cli 3.0 访问静态资源问题

    [问题背景] 用Vue clie 3.0的搭建得框架把我坑死了,在打包后,调用不到静态资源js,css,mp3等 [问题原因] vue cli 3.0打包后,dist目录下没有static目录,而Dj ...

  8. Visiual Studio CLR20r3问题

    原文转自:http://blog.sina.com.cn/s/blog_3f2ef11801013p8c.html(刘帝勇的大观园) 看到有更新,习惯性的点了,升级到Visiual Studio Ul ...

  9. window.addeventlistener使用方法

    http://www.jb51.net/article/49858.htm .................................................... (要注意的是div ...

  10. js window对象属相和方法相关整理资料

    window对象有以下方法: open close alert confirm prompt setTimeout clearTimeout setInterval clearInterval mov ...