iOS coredata 多表查询
先創(chuàng)建幾個(gè)表。
1、部門表:department
????? dp_id? Integer?primary key
????? dp_deptname??varchar(20) //使用coredata實(shí)體創(chuàng)建時(shí)用string就行
圖:
?
2、員工表:employee
???? em_id Integer? primary key
???? em_name? varchar(30)
???? em_sex??integer?? // 0:保密,1男,2女,默認(rèn)為0
???? em_age? integer
???? em_bankCardid varchar(20) //卡號
???? dp_id_emfkinteger //外鍵用于關(guān)聯(lián)部門表(1VN)
???? pt_id_emfk integer //外鍵用于關(guān)聯(lián)職位表(1VN)
???? bk_id_emfk integer// 外鍵用于關(guān)聯(lián)開戶行(1VN)
?
3、職位表:post
???? pt_id Integer? primary key
???? pt_name varchar(20)??//職位名稱
???? dp_id_ptfkinteger //外鍵用戶關(guān)聯(lián)部門表(1VN)
????? sy_id_ptfkinteger //外鍵關(guān)聯(lián)工資等級表(1V1)
?
4、工資等級表:salary
???? sy_id? integer primary key
???? sy_scale? double? //比例 (用于后屬算獎(jiǎng)金)
???? sy_level varchar(2)?//A,B,C,D..等等級
?
5、開戶銀行:bank
???? bk_id integer primary key
???? bk_name varchar(50)??//銀行名稱
???? bk_address varchar(200) //開戶地址
?
?
表建好了我們來看一表之間的關(guān)系。
部門和員工:一個(gè)部門有多個(gè)員工,而一個(gè)員工只能呆在一個(gè)部門(如果同時(shí)在兩個(gè)部分哪是兼職或者能人不在討論范圍),因此部門和員工的關(guān)系為1對多關(guān)系。
部門與職位:一個(gè)部門有多個(gè)職位,而一個(gè)職位只能在一個(gè)部門。因此為:1對多關(guān)系。?
部門與工資,開戶銀行,沒有直接關(guān)系。(當(dāng)然部門可能與獎(jiǎng)金有掛勾,這個(gè)也不在當(dāng)前討論范圍)
?
員工與職位:一個(gè)員工只能身處一職(能人,兼職除外),而一個(gè)職位可以由有多名員工。(如程序員職位,哪可以多名),因此為多對一關(guān)系。
員工與工資等級:一個(gè)員工只能對應(yīng)一個(gè)工程等級和比例,而一個(gè)等級比例可以由多名員工擁有。因此為多對一關(guān)系。
員工與開戶行:當(dāng)公司替員工開卡的時(shí)候,哪么一個(gè)開戶銀行就有多個(gè)員工。所以這里會有多對1關(guān)系。
?
職位與工資等級:一個(gè)職位只配備一個(gè)工資級別,同時(shí)一個(gè)工次級別也只屬于一個(gè)職位。因?yàn)闉?對1關(guān)系。
職位與開戶行沒有直接關(guān)系。
開戶行和工資等級也沒有直接關(guān)系。
?
下面來構(gòu)造測試數(shù)據(jù)
部門數(shù)據(jù):
??????1?????? HR????? //人力資源
??????2?????? DEV??? //開發(fā)
??????3???????POD ? //運(yùn)維
?
?
員工數(shù)據(jù):
????? 1???? 張三?? 男 20?? 46326587439043??2???? 3??2???????????? //張三是開發(fā)部的開發(fā)工程師
????? 2??? 李四??? 女? 18??? 32565443246567?1????2???3???????????//李四是HR的人事經(jīng)理
????? 3??? 歐陽??? 女?? 26???14354654656767?3???9????3??????????//歐陽是運(yùn)維的大客戶經(jīng)理
????? 4??? 歐陽???? 女?? 22?? 98734298437433?2?? 6??3??????????? //同名歐陽是開發(fā)部測試工程師
?
職位數(shù)據(jù):
????? 1??? 行政專員????????????1?????? NULL
?????? 2?? 人事經(jīng)理?????????????1??????3
?????? 3??? 開發(fā)工程師????????2??????2
???????4???架構(gòu)師????????????????2????? NULL
???????5???項(xiàng)目經(jīng)理????????????2????? NULL
?????? 6??? 測試工程師????????2?????1
?????? 7??? 銷售代表????????????3??? NULL
?????? 8??? 銷售經(jīng)理????????????3??? NULL
?????? 9??? 大客戶經(jīng)理????????3???????4
?
?
工資等級數(shù)據(jù):
????? 1????0.1??? D?????
??????2???? 0.15??? C
?????3??????? 0.4?? B
?????4??????? 0.8?? A
?
開戶行數(shù)據(jù):
???? 1??? 招行???? 廣州????????
???? 2?? 浦發(fā)???? 上海??????????
?????3?? 工行????? 深圳??????????
?
注:以上是為了作多表關(guān)聯(lián)查詢做的故意設(shè)計(jì)的,并沒有使用關(guān)系數(shù)據(jù)庫的范式來設(shè)計(jì)表,因此可能有存在不合理的地方。
紅色部分字符,如果是使用CoreData的實(shí)體來建,就創(chuàng)建為relationship字段。
大家可以按以上結(jié)構(gòu)在SQLITE中創(chuàng)建好表結(jié)構(gòu)。
數(shù)據(jù)造好了,下面將進(jìn)行相關(guān)查詢演示:
?
1、查詢開發(fā)部門中名為張三的工資等級。
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
上面一共用到四張表關(guān)聯(lián)。
?
2、查詢運(yùn)維部名為歐陽的工資等級及開戶銀行。
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
以上為五張表的關(guān)聯(lián)
?
在造表時(shí)不建議大家建太多的外鍵。如果設(shè)及到多表之間的關(guān)系,我們應(yīng)該是另外專門建立一張專門的關(guān)聯(lián)表來進(jìn)行維護(hù)。
這里為只是作演示,我這里就不再列關(guān)聯(lián)表了。
在IOS CoreData中,多表查詢上相對來說,沒有SQL直觀,但COREDATA的功能還是可以完成相關(guān)操作的。
多表查詢,表與表之間肯定存在某種關(guān)系,如果對于類似外連接,左連接等操作,在COREDATA中就顯得無力(請高手指教了)。
在上節(jié)中,介紹了一下數(shù)據(jù)庫的關(guān)系查詢操作。
下面使用CoreData進(jìn)行關(guān)系數(shù)據(jù)庫的表與表之間的關(guān)系演示。
生成COREDATA和如何設(shè)置關(guān)系就不再詳談了,見之前的文章。
?
建立好的關(guān)系圖:
?
?
一步步建立上面關(guān)系圖:
先建立部門表,員工表,職位表,工資等級表,開戶銀行表
?
上面建立表之后,我們還需要建立表之間的關(guān)系
部門和員工之間的關(guān)系:1 V? N
部門和職位的關(guān)系:1? V? N
員工與職位的關(guān)系:多對一關(guān)系
員工與開戶行:一個(gè)員工只能提供一個(gè)開戶行,但一個(gè)開戶行可以給多名員工進(jìn)行開卡。所以關(guān)系為N V 1;
?
職位和工資等級:一個(gè)職位只對應(yīng)一個(gè)工資等級;1V1
?
下面插入測試數(shù)據(jù):
-?(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?=?@"人事經(jīng)理";
????pt2.dept?=?dept;
????
????Post?*pt3=?[NSEntityDescription?insertNewObjectForEntityForName:@"Post"?inManagedObjectContext:self.managedObjectContext];
????pt3.pt_name?=?@"開發(fā)工程師";
????pt3.dept?=?dept2;
????pt3.salary?=?sy2;
????
????pt=?[NSEntityDescription?insertNewObjectForEntityForName:@"Post"?inManagedObjectContext:self.managedObjectContext];
????pt.pt_name?=?@"架構(gòu)師";
????pt.dept?=?dept2;
????
????pt=?[NSEntityDescription?insertNewObjectForEntityForName:@"Post"?inManagedObjectContext:self.managedObjectContext];????
????pt.pt_name?=?@"項(xiàng)目經(jīng)理";
????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?=?@"銷售經(jīng)理";
????pt.dept?=?dept3;
????
????Post?*pt9=?[NSEntityDescription?insertNewObjectForEntityForName:@"Post"?inManagedObjectContext:self.managedObjectContext];
????pt9.pt_name?=?@"大客戶經(jīng)理";
????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?=?@"浦發(fā)";
????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];
}
?
數(shù)據(jù)庫中數(shù)據(jù):
?
1、查詢開發(fā)部門中名為張三的工資等級
?
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、查詢運(yùn)維部名為歐陽的工資等級及開戶銀行
?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];?//從數(shù)組中進(jìn)行過濾。
????
????NSLog(@"%@",((Employee*)[ret?objectAtIndex:0]).post.salary.sy_level);
?
?
多表查詢主要就在于表之間建立好相關(guān)的關(guān)聯(lián)關(guān)系(relationship),其次就是充分的使用NSPredicate 這個(gè)查詢條件來進(jìn)行過濾。
?
總結(jié)
以上是生活随笔為你收集整理的iOS coredata 多表查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 石家庄回应快餐店推2万元豪华面 若与宣传
- 下一篇: 中国厂商大规模重返 MWC 2023 舞