最近遇到一個(gè) CoreData 的坑豪嚎,查了半天網(wǎng)上沒(méi)有相關(guān)的訊息舷礼,在此記錄一下,警示后人尉桩。
在使用 CoreData 存儲(chǔ)數(shù)組時(shí)筒占,當(dāng)你第一次往數(shù)組里添加對(duì)象的時(shí)候,Context 能夠檢測(cè)到實(shí)體的數(shù)組屬性 hasChanged 從而調(diào)用 save: ?函數(shù) 蜘犁,將數(shù)組存入數(shù)據(jù)庫(kù)翰苫,但是當(dāng)你退出當(dāng)前應(yīng)用,再次打開(kāi)的時(shí)候改變實(shí)體的數(shù)組屬性沽瘦,比如新添加對(duì)象或者刪除對(duì)象革骨,Context 將檢測(cè)不到數(shù)組的變化從而在存儲(chǔ)的時(shí)候忽視數(shù)組。
也就是說(shuō)析恋,CoreData 存儲(chǔ)數(shù)組只能在第一次改變數(shù)組的值的時(shí)候正確的進(jìn)行存儲(chǔ)良哲,筆者試著使用mutableCopy 新創(chuàng)建一個(gè)數(shù)組再賦值給原數(shù)組從而改變指針,但事實(shí)證明指針的改變同樣不能使Context 檢測(cè)到數(shù)組的改變助隧。(筆者查閱了 Stack Overflow 和官方文檔筑凫,沒(méi)有找到相關(guān)的可以改變這種情況的信息滑沧,如果讀者知道的話請(qǐng)?jiān)谠u(píng)論中指出)
在使用CoreData存儲(chǔ)數(shù)組的時(shí)候,如果需求是存儲(chǔ)之后數(shù)組不再需要改變巍实,那么將數(shù)組作為實(shí)體的屬性是不錯(cuò)的選擇滓技,但是如果需求是存儲(chǔ)之后數(shù)組需要改變的,我們就應(yīng)該使用 Coredata 的relationship 功能棚潦,將原數(shù)組中的對(duì)象作為一個(gè)新的實(shí)體來(lái)進(jìn)行管理令漂,并用一個(gè)一對(duì)多的 relationship 來(lái)代替數(shù)組的功能。
值得一提的是丸边,relationship 管理用的是 NSSet 類叠必,這是一個(gè)無(wú)序的,并且比 NSArray 更高效的集合對(duì)象 妹窖,但是我們項(xiàng)目中經(jīng)常需要有序的集合類作為數(shù)據(jù)源纬朝,這時(shí)候我們可以使用
NSSet *nsset;
NSArray *sort=@[[[NSSortDescriptor alloc]initWithKey:@"property" ascending:YES]];
NSArray *array=[nsset sortedArrayUsingDescriptors:sort];
希望大家以后不要在走到這個(gè)坑里面去咯~