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

關(guān)系設置區(qū)域
Q2:xcode8以上通過模型create NSManagedObject subclass時默認創(chuàng)建為swift文件,可能會導致項目各種報錯
-
S2:先選擇模型文件并選擇然后找到Language進行修改
選擇模型文件
找到Language進行修改
Q3:通過模型create NSManagedObject subclass創(chuàng)建實體文件時,默認可能將文件創(chuàng)建到項目最外層目錄下
- S3:貌似是Xcode的一個bug,一定要用Group的那個選項來選擇路徑,才能在正確地路徑下創(chuàng)建

路徑選擇區(qū)域
Q4:創(chuàng)建CoreDataManager后,報錯:Receiver ‘xxx’ for class message is a forward declaration或者Receiver type ‘xxx’ for instance message is a forward declaration

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

Edit Scheme

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

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

原來使用的options

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


