最近需要將項(xiàng)目的數(shù)據(jù)存儲(chǔ)模式改為CoreData,所以來(lái)總結(jié)一下遇到的問(wèn)題以及解決方法
在使用CoreData前,先在Libraries里導(dǎo)入CoreData.framework
首先是創(chuàng)建模型
Q1:創(chuàng)建Entitles時(shí),如果想要數(shù)組或者字典的屬性怎么辦
S1:網(wǎng)上已經(jīng)有答案,選擇Transformable即可,將請(qǐng)求的NSData數(shù)據(jù)直接放入數(shù)據(jù)庫(kù)中,不需要取解Json,在取數(shù)據(jù)的時(shí)候,解析數(shù)據(jù)即可
S2:或者再創(chuàng)建一個(gè)實(shí)體,進(jìn)行關(guān)聯(lián)(Relationships),這個(gè)方法會(huì)比較麻煩,具體看自己的對(duì)象關(guān)聯(lián)方式怎么設(shè)計(jì),而且需要更多的CoreData知識(shí)。比如進(jìn)行關(guān)聯(lián)的時(shí)候,要關(guān)注下面這兩屬性是什么意思,網(wǎng)上也已經(jīng)有答案了:
##刪除關(guān)系
NoAction(無(wú)操作):當(dāng)A被刪除時(shí),B對(duì)象不變,但會(huì)指向一個(gè)不存在的對(duì)象,一般不建議使用;
Nullify(作廢):當(dāng)A對(duì)象被刪除時(shí),B對(duì)象指向的A對(duì)象會(huì)置為空,如果A與B的關(guān)系式一對(duì)多,則是A對(duì)象從B容器中移除
Cascade(級(jí)聯(lián)):當(dāng)A對(duì)象被刪除時(shí),A對(duì)象指向的B對(duì)象也會(huì)被刪除;
Deny(拒絕):當(dāng)刪除指向?qū)ο驜存在的A對(duì)象時(shí),操作將會(huì)被拒絕;
##對(duì)象對(duì)應(yīng)關(guān)系
ToMany: 表示一個(gè)A對(duì)象可以包含多個(gè)B對(duì)象;
ToOne: 表示一個(gè)A對(duì)象只能對(duì)應(yīng)一個(gè)B對(duì)象;

Q2:xcode8以上通過(guò)模型create NSManagedObject subclass時(shí)默認(rèn)創(chuàng)建為swift文件,可能會(huì)導(dǎo)致項(xiàng)目各種報(bào)錯(cuò)
-
S2:先選擇模型文件并選擇然后找到Language進(jìn)行修改
選擇模型文件
找到Language進(jìn)行修改
Q3:通過(guò)模型create NSManagedObject subclass創(chuàng)建實(shí)體文件時(shí),默認(rèn)可能將文件創(chuàng)建到項(xiàng)目最外層目錄下
- S3:貌似是Xcode的一個(gè)bug,一定要用Group的那個(gè)選項(xiàng)來(lái)選擇路徑,才能在正確地路徑下創(chuàng)建

Q4:創(chuàng)建CoreDataManager后,報(bào)錯(cuò):Receiver ‘xxx’ for class message is a forward declaration或者Receiver type ‘xxx’ for instance message is a forward declaration

- S4: 網(wǎng)上查到的貌似是ARC和MRC的原因,但是我是導(dǎo)入#import <CoreData/CoreData.h>就可以了,如果有其他的解決方法,請(qǐng)分享給我
Q5:想要查看CoreData存儲(chǔ)的具體log
- S5:看下圖


Q6:創(chuàng)建一個(gè)實(shí)體,但是在CoreData創(chuàng)建的數(shù)據(jù)庫(kù)中動(dòng)態(tài)創(chuàng)建多張表
- S6:看到很多大神都是說(shuō)一個(gè)實(shí)體一張表,但是我想要實(shí)現(xiàn)移動(dòng)端不同用戶建一張表,不同的用戶標(biāo)識(shí)不同的表名,同一臺(tái)手機(jī),當(dāng)?shù)卿汚用戶的時(shí)候讀取的是A表,A退出B登錄,就讀取B表,但是這個(gè)貌似是沒(méi)有很好解決辦法的;所以我就只能在在實(shí)體再加一個(gè)用戶標(biāo)識(shí)的字段,每次讀取時(shí)用NSPredicate來(lái)篩選(暫時(shí)就這樣吧,也許還有很多我不懂的地方,歡迎交流)
----------------------------------------------------------------------------------2017.03.17
Q7:最近又發(fā)現(xiàn)一個(gè)問(wèn)題:怎么我用的CoreData老是崩潰,錯(cuò)誤信息:[[__NSCFSet addObject:]: attempt to insert nil'],老是斷在在save這個(gè)方法,我還特意加個(gè)判斷實(shí)體是否為空再來(lái)save,可是貌似沒(méi)什么用;找了一下看到stackoverflow里面還挺多這種情況的,所以我參考了下面這位的方法

-
S7:注意創(chuàng)建時(shí)用NSPrivateQueueConcurrencyType,大家都試試吧
創(chuàng)建NSManagedObjectContext
----------------------------------------------------------------------------------2017.04.13
Q8:一不小心又發(fā)現(xiàn)一個(gè)崩潰問(wèn)題:returned error Error Domain=NSCocoaErrorDomain Code=134140 "永久性儲(chǔ)存轉(zhuǎn)移失敗,缺少映射模型。" ,看到有人說(shuō)是在存儲(chǔ)的時(shí)候數(shù)據(jù)類型不一致導(dǎo)致的,我已經(jīng)查到這個(gè)小bug并修復(fù)了但是還是報(bào)錯(cuò);reason = "Can't find mapping model for migration"用這個(gè)reason去stackoverflow里面也能看到好幾個(gè)這樣的問(wèn)題但是都是好幾年前的,所以我繼續(xù)找了一下,還是能找到答案的


- S7:options新加了一個(gè)鍵值對(duì):NSInferMappingModelAutomaticallyOption:@YES
NSMigratePersistentStoresAutomaticallyOption:這個(gè)操作表示自動(dòng)遷移Persistent Store
NSInferMappingModelAutomaticallyOption這個(gè)操作是表示自動(dòng)創(chuàng)建Mapping Model。
如果只是使用了NSMigratePersistentStoresAutomaticallyOption:@YES卻沒(méi)有帶上NSInferMappingModelAutomaticallyOption:@YES就可能導(dǎo)致像我上面提到的出錯(cuò)。原因可能就是當(dāng)數(shù)據(jù)的物理信息發(fā)生變化時(shí),PersistentStores會(huì)自動(dòng)創(chuàng)建,但是缺失了MappingModel。MappingModel是為PersistentStores服務(wù)的,所以最好一起帶上比較安全。
----------------------------------------------------------------------------------2017.05.25


