-
綜合
所有的本地持久化數(shù)據(jù)存儲(chǔ)的本質(zhì)都是寫文件,而且只能存到沙盒中。
沙盒機(jī)制是蘋果的一項(xiàng)安全機(jī)制,本質(zhì)就是系統(tǒng)給每個(gè)應(yīng)用分配了一個(gè)文件夾來存儲(chǔ)數(shù)據(jù),而且每個(gè)應(yīng)用只能訪問分配給自己的那個(gè)文件夾,其他應(yīng)用的文件夾是不能訪問的。
數(shù)據(jù)存儲(chǔ)的核心都是寫文件。主要有四種持久化方式:屬性列表,對(duì)象序列化,SQLite 數(shù)據(jù)庫, CoreData
屬性列表:應(yīng)用于少量數(shù)據(jù)存儲(chǔ),比如登陸的用戶信息,應(yīng)用程序配置信息等。只有NSString ,NSArray,NSDictory,NSData,可以WriteToFile;存儲(chǔ)的依舊是plist文件,plist文件可以存儲(chǔ)的7種數(shù)據(jù)類型:array,dictory,string,bool,data,date,number。
-
詳細(xì)
對(duì)象序列化:最終也是存為屬性列表文件,如果程序中,需要存儲(chǔ)的時(shí)候,直接存儲(chǔ)對(duì)象比較方便,例如有一個(gè)設(shè)置類,我們可以把設(shè)置類的對(duì)象直接存儲(chǔ),就沒必要再把里面的每一個(gè)屬性單獨(dú)存到文件中。對(duì)象序列化是將一個(gè)實(shí)現(xiàn)了NSCoding協(xié)議的對(duì)象,通過序列化(NSKeydArchiver)的形式,將對(duì)象中的屬性抽取出來,轉(zhuǎn)化成二進(jìn)制流,也就是NSData,NSData可以選擇write to file 或者存儲(chǔ)到NSUserdefault中。 必須實(shí)現(xiàn)的兩個(gè)方法 encodeWithCoder,initWithCoder。對(duì)象序列化的本質(zhì)就是 對(duì)象NSData。
SQLite: 適合大量,重復(fù),有規(guī)律的數(shù)據(jù)存儲(chǔ)。而且頻繁的讀取,刪除,過濾數(shù)據(jù),這種適合使用數(shù)據(jù)庫 (iOS 使用第三方FMDB)
CoreData: Sqlite叫做關(guān)系型數(shù)據(jù)庫,CoreData 是一中OR-Mapping的思想 ,O代表對(duì)象Object,R代表relationship,Mapping代表映射,直譯過來就是對(duì)象關(guān)系映射,其實(shí)就是把對(duì)象的屬性和表中的字段自動(dòng)映射,簡(jiǎn)化程序員的負(fù)擔(dān),以面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫。ORMapping是一種思想,CoreData實(shí)現(xiàn)了這種思想,在Java中,hibernate 也是對(duì)ORMapping的一種實(shí)現(xiàn),只是利用java實(shí)現(xiàn)的。
CoreData 本質(zhì)還是數(shù)據(jù)庫,只不過使用起來更加面向?qū)ο螅魂P(guān)注二維的表結(jié)構(gòu),而是只需要關(guān)注對(duì)象,純面向?qū)ο蟮臄?shù)據(jù)操作方式。我們直接使用數(shù)據(jù)庫的時(shí)候,如果向數(shù)據(jù)庫中插入數(shù)據(jù),一般是把一個(gè)對(duì)象的屬性和數(shù)據(jù)庫中某個(gè)表的字段一一對(duì)應(yīng),然后把對(duì)象的屬性存儲(chǔ)到具體的表字段中.取一條數(shù)據(jù)的時(shí)候,把表中的一行數(shù)據(jù)取出,同樣需要再封裝到對(duì)象的屬性中,這樣的方式有點(diǎn)繁瑣,不面向?qū)ο蟆oreData解決的問題就是不需要這個(gè)中間的轉(zhuǎn)換過程,看起來是直接把對(duì)象存儲(chǔ)進(jìn)去,并且取出來,不關(guān)心表的存在,實(shí)際內(nèi)部幫你做好了映射關(guān)系。
更多:iOS面試題合集