前言:
從上次寫完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í)體建完了,下一步是添加關(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è)趺葱薷哪?,看圖:

修改紅框中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

至于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)斧正。