CoreData的冰山一角

最近需要將項(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ì)象;
關(guān)系設(shè)置區(qū)域

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)建
路徑選擇區(qū)域

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

不明所以的報(bào)錯(cuò),求解
  • S4: 網(wǎng)上查到的貌似是ARC和MRC的原因,但是我是導(dǎo)入#import <CoreData/CoreData.h>就可以了,如果有其他的解決方法,請(qǐng)分享給我

Q5:想要查看CoreData存儲(chǔ)的具體log

  • S5:看下圖
Edit Scheme
找到Run-Arguments,然后下面加入兩個(gè)字段

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里面還挺多這種情況的,所以我參考了下面這位的方法

大神的對(duì)話
  • 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ù)找了一下,還是能找到答案的

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

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

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

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