现在的位置: 首页 > 综合 > 正文

iOS coredata 多表查询

2018年05月12日 ⁄ 综合 ⁄ 共 9357字 ⁄ 字号 评论关闭

先创建几个表。

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_emfkinteger //外键用于关联部门表(1VN)

     pt_id_emfk integer //外键用于关联职位表(1VN)

     bk_id_emfk integer// 外键用于关联开户行(1VN)

 

3、职位表:post

     pt_id Integer  primary key

     pt_name varchar(20)  //职位名称

     dp_id_ptfkinteger //外键用户关联部门表(1VN)

      sy_id_ptfkinteger //外键关联工资等级表(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,employeeb,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 fromdeparment a,employee b,salary c ,post d ,bank e where b.em_name ="欧阳" anda.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 = [NSEntityDescriptionentityForName:@"Employee"inManagedObjectContext:self.managedObjectContext];
    NSFetchRequest *frq = [[[NSFetchRequestalloc]init]autorelease];
   
    [frq setEntity:emEty];
   
    NSPredicate * cdt = [NSPredicatepredicateWithFormat:@"em_name = %@",@"张三"];
   
    [frq setPredicate:cdt];
   
    NSArray *objs =[self.managedObjectContextexecuteFetchRequest: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 这个查询条件来进行过滤。

 

抱歉!评论已关闭.