iOS 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_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 這個查詢條件來進行過濾。
?
總結
以上是生活随笔為你收集整理的iOS coredata 多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 石家庄回应快餐店推2万元豪华面 若与宣传
- 下一篇: 中国厂商大规模重返 MWC 2023 舞