在​​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 这个查询条件来进行过滤。


------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。