core data 如何实现多表查询

转自:http://blog.csdn.net/fengsh998/article/details/8111855 在网上搜索了下,发现只有部分讲解CoreData关系的,但对多表之间的查询并没有相应的介绍。 因此操作自己写了个。 先创建几个表。 1、部门表:department dp_id  Integer  primary key dp_deptname   varchar(20) //使用coredata实体创建时用string就行 图:
  2、员工表:employee em_id Integer  primary key em_name  varchar(30) em_sex   integer   // 0:保密,1男,2女,默认为0 em_age  integer em_bankCardid varchar(20) //卡号 dp_id_emfk integer //外键用于关联部门表(1VN) pt_id_emfk integer //外键用于关联职位表(1VN) bk_id_emfk integer// 外键用于关联开户行(1VN)
3、职位表:post pt_id Integer  primary key pt_name varchar(20)   //职位名称 dp_id_ptfk integer //外键用户关联部门表(1VN) sy_id_ptfk integer //外键关联工资等级表(1V1)
  4、工资等级表:salary sy_id  integer primary key sy_scale  double  //比例 (用于后属算奖金) sy_level varchar(2)  //A,B,C,D..等等级
5、开户银行:bank bk_id integer primary key bk_name varchar(50)   //银行名称 bk_address varchar(200) //开户地址
  表建好了我们来看一表之间的关系。 部门和员工:一个部门有多个员工,而一个员工只能呆在一个部门(如果同时在两个部分哪是兼职或者能人不在讨论范围),因此部门和员工的关系为1对多关系。 部门与职位:一个部门有多个职位,而一个职位只能在一个部门。因此为:1对多关系。 部门与工资,开户银行,没有直接关系。(当然部门可能与奖金有挂勾,这个也不在当前讨论范围)   员工与职位:一个员工只能身处一职(能人,兼职除外),而一个职位可以由有多名员工。(如程序员职位,哪可以多名),因此为多对一关系。 员工与工资等级:一个员工只能对应一个工程等级和比例,而一个等级比例可以由多名员工拥有。因此为多对一关系。 员工与开户行:当公司替员工开卡的时候,哪么一个开户银行就有多个员工。所以这里会有多对1关系。   职位与工资等级:一个职位只配备一个工资级别,同时一个工次级别也只属于一个职位。因为为1对1关系。 职位与开户行没有直接关系。 开户行和工资等级也没有直接关系。   下面来构造测试数据 部门数据: 1       HR      //人力资源 2       DEV    //开发 3       POD   //运维  
员工数据: 1     张三   男 20   46326587439043   2     3   2             //张三是开发部的开发工程师 2    李四    女  18    32565443246567  1     2   3            //李四是HR的人事经理 3    欧阳    女   26   14354654656767  3    9    3           //欧阳是运维的大客户经理 4    欧阳     女   22   98734298437433  2   6   3            //同名欧阳是开发部测试工程师
  职位数据: 1    行政专员             1       NULL 2   人事经理              1      3 3    开发工程师         2      2 4    架构师                 2      NULL 5    项目经理             2      NULL 6    测试工程师         2     1 7    销售代表             3    NULL 8    销售经理             3    NULL 9    大客户经理         3       4  
工资等级数据: 1     0.1    D 2     0.15    C 3        0.4   B 4        0.8   A  
开户行数据: 1    招行     广州 2   浦发     上海 3   工行      深圳  
注:以上是为了作多表关联查询做的故意设计的,并没有使用关系数据库的范式来设计表,因此可能有存在不合理的地方。 红色部分字符,如果是使用CoreData的实体来建,就创建为relationship字段。 大家可以按以上结构在SQLITE中创建好表结构。 数据造好了,下面将进行相关查询演示:   1、查询开发部门中名为张三的工资等级。 select  c.sy_level as dj from deparment a,employee b,salary c ,post d  where b.em_name = "张三" and a.dp_deptname = "dev" and a.dp_id = b.dp_id_emfk and d.sy_id_ptfk = c.sy_id and d.pt_id = b.pt_id_emfk 上面一共用到四张表关联。
  2、查询运维部名为欧阳的工资等级及开户银行。 select  c.sy_level as dj, e.bk_name kfh from deparment a,employee b,salary c ,post d ,bank e where b.em_name = "欧阳" and a.dp_deptname = "dev" and a.dp_id = b.dp_id_emfk and d.sy_id_ptfk = c.sy_id and d.pt_id = b.pt_id_emfk and e.bk_id = b.bk_id_emfk 以上为五张表的关联  
  在造表时不建议大家建太多的外键。如果设及到多表之间的关系,我们应该是另外专门建立一张专门的关联表来进行维护。 这里为只是作演示,我这里就不再列关联表了。   在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 这个查询条件来进行过滤。

posted on 2013-10-20 12:11  流れ星ーー  阅读(606)  评论(0编辑  收藏  举报

导航