CoreData的冰山一角

最近需要將項目的數(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,537評論 6 13
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,658評論 30 472
  • 1 前言 CoreData不僅僅是數(shù)據(jù)庫,而是蘋果封裝的一個更高級的數(shù)據(jù)持久化框架,SQLite只是其提供的一種數(shù)...
    RichardJieChen閱讀 3,155評論 2 2
  • 這幾天面試了幾位90年左右的女生,年齡說大不大,說小不小,基本都工作了5年以上,卻始終處于迷茫的狀態(tài),特別是文科生...
    千萬里尋小小雨閱讀 1,076評論 0 7
  • KVO:(Key-Value-Observer)鍵值觀察者,是觀察者設計模式的一種具體實現(xiàn)。 在我們編程中,很多時...
    邦奇諾閱讀 303評論 0 2

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