core data 如何實現多表查詢

轉自:http://blog.csdn.net/fengsh998/article/details/8111855 在網上搜索了下,發現只有部分講解CoreData關係的,但對多表之間的查詢並無相應的介紹。 所以操做本身寫了個。 先建立幾個表。 一、部門表:department dp_id  Integer  primary key dp_deptname   varchar(20) //使用coredata實體建立時用string就行 圖:
  二、員工表: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)
三、職位表:post pt_id Integer  primary key pt_name varchar(20)   //職位名稱 dp_id_ptfk integer //外鍵用戶關聯部門表(1VN) sy_id_ptfk integer //外鍵關聯工資等級表(1V1)
  四、工資等級表:salary sy_id  integer primary key sy_scale  double  //比例 (用於後屬算獎金) sy_level varchar(2)  //A,B,C,D..等等級
五、開戶銀行: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中建立好表結構。 數據造好了,下面將進行相關查詢演示:   一、查詢開發部門中名爲張三的工資等級。 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 上面一共用到四張表關聯。
  二、查詢運維部名爲歐陽的工資等級及開戶銀行。 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]; }
  數據庫中數據:   一、查詢開發部門中名爲張三的工資等級   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);   二、查詢運維部名爲歐陽的工資等級及開戶銀行
 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 這個查詢條件來進行過濾。
相關文章
相關標籤/搜索