coreData多實(shí)體關(guān)聯(lián)相關(guān)

前言:

從上次寫完coreData的基礎(chǔ)應(yīng)用,到現(xiàn)在終于把當(dāng)初的留下的多表關(guān)聯(lián)的坑補(bǔ)上了。話不多說(shuō),圖文走起。

開(kāi)發(fā)環(huán)境

xcode 8.3.1 ;iOS >8.0 ;語(yǔ)言:OC

coreData多實(shí)體關(guān)聯(lián)

在開(kāi)始代碼前先設(shè)計(jì)一個(gè)模型,即多實(shí)體相關(guān)現(xiàn)實(shí)模型,如下:

1、某公司有若干員工,員工即可抽象成一個(gè)實(shí)體,其屬性包括編號(hào),名稱,所屬部門等。
2、員工擁有行政分組,即所屬部門有所不同,行政分組可抽象成一個(gè)實(shí)體,其屬性包括名稱,所屬員工等,重點(diǎn)來(lái)了,一個(gè)行政分組實(shí)體對(duì)應(yīng)多個(gè)員工,一個(gè)員工只對(duì)應(yīng)一個(gè)行政分組,即行政分組實(shí)體對(duì)應(yīng)員工實(shí)體關(guān)系為一對(duì)多,員工實(shí)體對(duì)應(yīng)行政分組實(shí)體關(guān)系為一對(duì)多。
3、員工擁有報(bào)銷成本分組(下文稱成本分組),即報(bào)銷款項(xiàng)的多少有所不同,成本分組可抽象成一個(gè)實(shí)體,其屬性包括名稱,所屬員工等,重點(diǎn)又來(lái)了,一個(gè)成本分組實(shí)體對(duì)應(yīng)多個(gè)員工,一個(gè)員工只對(duì)應(yīng)一個(gè)成本分組,即成本分組實(shí)體對(duì)應(yīng)員工實(shí)體關(guān)系為一對(duì)多,員工實(shí)體對(duì)應(yīng)成本分組實(shí)體關(guān)系為一對(duì)多。
4、為了讓我們的多實(shí)體關(guān)聯(lián)關(guān)系復(fù)雜一點(diǎn),我們?nèi)藶橐?guī)定,讓行政分組與成本分組擁有多對(duì)多的關(guān)系,即同一個(gè)行政分組可能有幾個(gè)不同成本分組,同一個(gè)成本分組可能分屬于不同行政分組。

開(kāi)始建實(shí)體


行政分組實(shí)體

成本分組實(shí)體

員工實(shí)體

實(shí)體建完了,下一步是添加關(guān)系,觀察實(shí)體中添加屬性的下面有Relationship字樣,這就是添加關(guān)系的地方。點(diǎn)擊+,Relationship即關(guān)系的名稱,一般的我們要添加與誰(shuí)的關(guān)聯(lián)就把關(guān)系名稱寫成該對(duì)象即可,比如在員工實(shí)體中添加一個(gè)對(duì)行政分組的關(guān)系,Relationship寫organizationDept。Destination有下拉選項(xiàng),選項(xiàng)可以看到是其他實(shí)體,對(duì)的,你要和誰(shuí)有關(guān)聯(lián)就選中誰(shuí)。最后一項(xiàng)Inverse也下拉,但目前還沒(méi)有備選內(nèi)容,等會(huì)在來(lái)看。添加完員工對(duì)行政分組的實(shí)體關(guān)系,我們?cè)龠x中行政分組實(shí)體,照著上文添加一個(gè)對(duì)員工的實(shí)體關(guān)系。到添加Inverse時(shí)發(fā)現(xiàn)這會(huì)有選項(xiàng)了,沒(méi)錯(cuò)就一項(xiàng)就選你自己,然后我們?cè)偃T工實(shí)體看Inverse,發(fā)現(xiàn)已經(jīng)被自動(dòng)補(bǔ)上了。這樣我們就建立了實(shí)體間的關(guān)系。系統(tǒng)默認(rèn)為一對(duì)一(one by one),那我們?cè)趺葱薷哪?,看圖:


行政分組對(duì)員工關(guān)系為一對(duì)多

修改紅框中Type的類型即可。
除了Type,重要的還有delete rule,即定義關(guān)聯(lián)屬性的刪除規(guī)則。在當(dāng)前對(duì)象和其他對(duì)象有關(guān)聯(lián)關(guān)系時(shí),當(dāng)前對(duì)象被刪除后與之關(guān)聯(lián)對(duì)象的反應(yīng)。這個(gè)參數(shù)有備選項(xiàng):
  • NSNoActionDeleteRule 刪除后沒(méi)有任何操作,也不會(huì)將關(guān)聯(lián)對(duì)象的關(guān)聯(lián)屬性指向nil。刪除后使用關(guān)聯(lián)對(duì)象的關(guān)聯(lián)屬性,可能會(huì)導(dǎo)致其他問(wèn)題。
  • NSNullifyDeleteRule 刪除后會(huì)將關(guān)聯(lián)對(duì)象的關(guān)聯(lián)屬性指向nil,這是默認(rèn)值。
  • NSCascadeDeleteRule 刪除當(dāng)前對(duì)象后,會(huì)將與之關(guān)聯(lián)的對(duì)象也一并刪除。
  • NSDenyDeleteRule 在刪除當(dāng)前對(duì)象時(shí),如果當(dāng)前對(duì)象還指向其他關(guān)聯(lián)對(duì)象,則當(dāng)前對(duì)象不能被刪除。

然后就是按照之前的1234點(diǎn)添加關(guān)聯(lián)關(guān)系,添加完成后生成文件,(生成方法參照這里)。
然后我們選擇行政分組的CoreDataProperties.h文件發(fā)現(xiàn)除了其本身的屬性外多了相關(guān)關(guān)系,如果是一對(duì)一,則是一個(gè)屬性

@property (nullable, nonatomic, copy) NSString *name;
@property (nonatomic) int64_t orgId;
@property (nullable, nonatomic, retain) NSSet<CostDept *> *costDept;
@property (nullable, nonatomic, retain) SEmployee *semployee;

而如果是一對(duì)多則如紅框所示,是一個(gè)NSSet


多對(duì)多關(guān)系

至于NSSet,它是一個(gè)無(wú)序的集合,你可以理解成沒(méi)有排序的數(shù)組,這里面保存這若干個(gè)“一對(duì)多”中的“多”的具體實(shí)體。其他的不在贅述。

注意

  • 當(dāng)你添加了多個(gè)實(shí)體的關(guān)系后,你改變其中一個(gè)實(shí)體的值,跟它有關(guān)聯(lián)的實(shí)體對(duì)應(yīng)的值也會(huì)跟著變。如果你的員工“張三”屬于“銷售”行政分組,你修改了“張三”的名字為“張四”,那么你查“銷售”分組中的員工姓名就從“張三”變成了“張四”。
  • 還是強(qiáng)調(diào)關(guān)聯(lián)了實(shí)體關(guān)系后,如果要執(zhí)行刪除操作,
    一定要先腦袋中過(guò)一遍會(huì)影響到的實(shí)體!
    一定要先腦袋中過(guò)一遍會(huì)影響到的實(shí)體!
    一定要先腦袋中過(guò)一遍會(huì)影響到的實(shí)體!
    盡管你說(shuō)我deleteRule選了Null,但是任有可能被置為nil的對(duì)象會(huì)影響程序。

最后

附上個(gè)小Demo(注:這個(gè)demo地址上github,要是打開(kāi)慢請(qǐng)耐心等待)解釋下這個(gè)demo是我之前寫的,里面有兩個(gè).xcdatamodeld文件,在viewController的viewDidLoad 方法中,可自行注釋掉一個(gè)放開(kāi)另一個(gè)。

DeptAndEmpCoreData.xcdatamodeld

兩個(gè)實(shí)體:Employee與Department
關(guān)系為:

  • 一個(gè)Employee對(duì)一個(gè)Employee
  • 一個(gè)Department對(duì)多個(gè)Employee

DeptAndCostModel.xcdatamodeld

三個(gè)實(shí)體:OrganizationDept、CostDept、SEmployee
關(guān)系為:

  • 多個(gè)OrganizationDept對(duì)多個(gè)CostDept
  • 多個(gè)CostDept對(duì)多個(gè)OrganizationDept
  • 一個(gè)OrganizationDept對(duì)一個(gè)SEmployee
  • 一個(gè)CostDept對(duì)一個(gè)SEmployee
  • 一個(gè)SEmployee對(duì)一個(gè)OrganizationDept
  • 一個(gè)SEmployee對(duì)一個(gè)CostDept

免責(zé)聲明

本文為本人作者總結(jié)及備忘記錄,分享給大家供學(xué)習(xí)參考,部分內(nèi)容有參考搜索引擎,若有侵權(quán),聯(lián)系本人刪除

  • 最最后,若有錯(cuò)誤,懇請(qǐng)斧正。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,332評(píng)論 6 13
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,638評(píng)論 18 399
  • 該文章屬于劉小壯原創(chuàng),轉(zhuǎn)載請(qǐng)注明:劉小壯[http://www.itdecent.cn/u/2de707c93d...
    劉小壯閱讀 27,407評(píng)論 75 85
  • 我嘲笑一條長(zhǎng)蟲, 每天都在奔跑, 每天都在原點(diǎn); 我可憐那些寄生蟲, 朦朧的雙眼, 疲軟的身體; 微不足道的蟲, ...
    馮家家家閱讀 292評(píng)論 0 1

友情鏈接更多精彩內(nèi)容