iOS中數(shù)據(jù)存儲(chǔ)方式的對(duì)比

在iOS開發(fā)過程中,不管是做什么應(yīng)用琴许,都會(huì)碰到數(shù)據(jù)存儲(chǔ)的問題。將數(shù)據(jù)存儲(chǔ)到本地溉躲,能夠讓程序的運(yùn)行更加流暢榜田,不會(huì)出現(xiàn)讓人厭煩的菊花,使得用戶體驗(yàn)更好锻梳。下面介紹一下數(shù)據(jù)保存的方式:
1.Write寫入方式:永久保存在磁盤中箭券。具體方法為:
第一步:獲得文件即將保存的路徑:

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask,YES);//使用C函數(shù)NSSearchPathForDirectoriesInDomains來獲得沙盒中目錄的全路徑。該函數(shù)有三個(gè)參數(shù),其中布爾值表示是否需要通過~擴(kuò)展路徑疑枯。

還有一種方法是使用NSHomeDirectory函數(shù)獲得sandbox的路徑:

 NSHomeDirectory();// Once you have the full sandbox path, you can create a path from it辩块,但是不能在sandbox的本文件層上寫文件也不能創(chuàng)建目錄,而應(yīng)該是此基礎(chǔ)上創(chuàng)建一個(gè)新的可寫的目錄荆永,例如Documents,Library或者temp废亭。NSString *documentPath = [sandboxPath            stringByAppendingPathComponent:@"Documents"];//將Documents添加到sandbox路徑上,具體原因前面分析了具钥!

這兩者的區(qū)別就是:使用NSSearchPathForDirectoriesInDomains比在NSHomeDirectory后面添加Document更加安全豆村。因?yàn)樵撐募夸浛赡茉谖磥戆l(fā)送的系統(tǒng)上發(fā)生改變。
第二步:生成在該路徑下的文件:

[documentDirectory stringByAppendingPathComponent:fileName];//fileName就是保存文件的文件名

第三步:往文件中寫入數(shù)據(jù):

[data writeToFile:FileName atomically:YES];//將NSData類型對(duì)象data寫入文件骂删,文件名為FileName

最后:從文件中讀出數(shù)據(jù):

[NSData dataWithContentsOfFile:FileName options:0 error:NULL];//從FileName中讀取出數(shù)據(jù)

2.NSKeyedArchiver:采用歸檔的形式來保存數(shù)據(jù)掌动,該數(shù)據(jù)對(duì)象需要遵守NSCoding協(xié)議,并且該對(duì)象對(duì)應(yīng)的類必須提供encodeWithCoder:和initWithCoder:方法桃漾。前一個(gè)方法告訴系統(tǒng)怎么對(duì)對(duì)象進(jìn)行編碼坏匪,而后一個(gè)方法則是告訴系統(tǒng)怎么對(duì)對(duì)象進(jìn)行解碼

@interface Person:NSObject<NSCoding>{//遵守NSCoding協(xié)議
      NSString *name;//待歸檔類型
}
@implementation Person
-(void)encodeWithCoder:(NSCoder *)aCoder{
          [aCoder encodeObject:name forKey:@"name"];
}

-(void)initWithCoder:(NSCoder *)aDecoder{
          name=[[aDeCoder decodeObjectforKey:@"name"] retain];**
}
歸檔操作:
對(duì)Person對(duì)象歸檔操作
//將復(fù)雜對(duì)象歸檔之后存入本地
    //第一步:創(chuàng)建一個(gè)NSMutableData 用于初始化歸檔工具
    NSMutableData *data = [NSMutableData data];
    //第二步:  創(chuàng)建一個(gè)歸檔工具
    NSKeyedArchiver *keyedArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    //第三步:使用歸檔工具 對(duì)需要?dú)w檔的對(duì)象進(jìn)行歸檔
    [keyedArchiver encodeObject:person forKey:@"person"];
    //第四步: 結(jié)束歸檔
    [keyedArchiver finishEncoding];
    
    NSLog(@"data3 === %@",data);
    
    NSString *filePath = [documentPathStr stringByAppendingPathComponent:@"person.plist"];
    
    [data writeToFile:filePath atomically:YES];
    
    NSLog(@"filePath == %@",filePath);

缺點(diǎn):歸檔的形式來保存數(shù)據(jù),只能一次性歸檔保存以及一次性解壓撬统。所以只能針對(duì)小量數(shù)據(jù)适滓,而且對(duì)數(shù)據(jù)操作比較笨拙,即如果想改動(dòng)數(shù)據(jù)的某一小部分恋追,還是需要解壓整個(gè)數(shù)據(jù)或者歸檔整個(gè)數(shù)據(jù)凭迹。歸檔數(shù)據(jù)儲(chǔ)存到本地實(shí)際上還是采用直接寫入本地的方式

3.NSUserDefaults:用來保存應(yīng)用程序設(shè)置和屬性罚屋、用戶保存的數(shù)據(jù)。用戶再次打開程序或開機(jī)后這些數(shù)據(jù)仍然存在嗅绸。NSUserDefaults可以存儲(chǔ)的數(shù)據(jù)類型包括:NSData脾猛、NSString、NSNumber鱼鸠、NSDate猛拴、NSArray、NSDictionary蚀狰。如果要存儲(chǔ)其他類型愉昆,則需要轉(zhuǎn)換為前面的類型,才能用NSUserDefaults存儲(chǔ)麻蹋。
具體實(shí)現(xiàn)為:
保存數(shù)據(jù):

NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
NSString *name = @”default string“;
[defaults setObject:firstName forKey:@"name"];  
//獲得UIImage實(shí)例
UIImage *image = [[UIImage alloc] initWithContentsOfFile:@"photo.jpg"];
NSData *imageData = UIImageJPEGRepresentation(image, 100);//UIImage對(duì)象轉(zhuǎn)換成NSData
[defaults synchronize];//用synchronize方法把數(shù)據(jù)持久化到standardUserDefaults[數(shù)據(jù)庫(kù)]

讀取數(shù)據(jù)

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *name = [defaults objectForKey:@"name"];//根據(jù)鍵值取出name
NSData *imageData = [defaults dataForKey:@"image"];
UIImage *Image = [UIImage imageWithData:imageData];//NSData轉(zhuǎn)換為UIImage

4. SQLite:采用SQLite數(shù)據(jù)庫(kù)來存儲(chǔ)數(shù)據(jù)跛溉。
第一步:需要添加SQLite相關(guān)的庫(kù)以及頭文件:
在項(xiàng)目文件的Build Phases下,找到Link Binary With Libraries扮授,添加libsqlite3.0.tbd芳室;
PS:libsqlite3.0.tbd和libsqlite3.tbd的區(qū)別
使用過sqlite的同學(xué)都會(huì)發(fā)現(xiàn)在加載sqlite類庫(kù)的時(shí)候會(huì)出現(xiàn)兩個(gè)libsqlite3.0.dylib和libsqlite3.dylib,之前我一直以為它們是兩個(gè)版本的刹勃,但是后來發(fā)現(xiàn)其實(shí)libsqlite3.0.dylib本身是一個(gè)連接堪侯,它指向libsqlite3.dylib,如圖所示:


我相信這個(gè)圖就能向大家說明一切荔仁,但是這里就有疑問了抖格,直接引用libsqlite3.dylib不就行了,為什么要用libsqlite3.0.dylib咕晋,其實(shí)這個(gè)指針總是指向最新的sqlite3動(dòng)態(tài)庫(kù)雹拄,比如說sqlite3庫(kù)更新了,如果我們引用的是libsqlite3.0.dylib你就不需要做任何修改了掌呜。
第二步:開始使用SQLite:
//1.打開數(shù)據(jù)庫(kù)
//2.對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作
//3.關(guān)閉數(shù)據(jù)庫(kù)
5.使用CoreData存儲(chǔ)數(shù)據(jù)
1.Core Data 是數(shù)據(jù)持久化存儲(chǔ)的最佳方式
2.數(shù)據(jù)最終的存儲(chǔ)類型可以是:SQLite數(shù)據(jù)庫(kù)滓玖,XML,二進(jìn)制质蕉,內(nèi)存里势篡,或自定義數(shù)據(jù)類型
3.好處:能夠合理管理內(nèi)存,避免使用sql的麻煩模暗,高效
4.構(gòu)成:
(1)NSManagedObjectContext(被管理的數(shù)據(jù)上下文)
操作實(shí)際內(nèi)容(操作持久層)
作用:插入數(shù)據(jù)禁悠,查詢數(shù)據(jù),刪除數(shù)據(jù)
(2)NSManagedObjectModel(被管理的數(shù)據(jù)模型)
數(shù)據(jù)庫(kù)所有表格或數(shù)據(jù)結(jié)構(gòu)兑宇,包含各實(shí)體的定義信息
作用:添加實(shí)體的屬性碍侦,建立屬性之間的關(guān)系
操作方法:視圖編輯器,或代碼
(3)NSPersistentStoreCoordinator(持久化存儲(chǔ)助理)
相當(dāng)于數(shù)據(jù)庫(kù)的連接器
作用:設(shè)置數(shù)據(jù)存儲(chǔ)的名字,位置瓷产,存儲(chǔ)方式站玄,和存儲(chǔ)時(shí)機(jī)
(4)NSManagedObject(被管理的數(shù)據(jù)記錄)
相當(dāng)于數(shù)據(jù)庫(kù)中的表格記錄
(5)NSFetchRequest(獲取數(shù)據(jù)的請(qǐng)求)
相當(dāng)于查詢語句
(6)NSEntityDescription(實(shí)體結(jié)構(gòu))
相當(dāng)于表格結(jié)構(gòu)
(7)后綴為.xcdatamodeld的包
里面是.xcdatamodel文件,用數(shù)據(jù)模型編輯器編輯
編譯后為.momd或.mom文件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末濒旦,一起剝皮案震驚了整個(gè)濱河市株旷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尔邓,老刑警劉巖晾剖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異梯嗽,居然都是意外死亡钞瀑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門慷荔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缠俺,你說我怎么就攤上這事显晶。” “怎么了壹士?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵磷雇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我躏救,道長(zhǎng)唯笙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任盒使,我火速辦了婚禮崩掘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘少办。我一直安慰自己苞慢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布英妓。 她就那樣靜靜地躺著挽放,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔓纠。 梳的紋絲不亂的頭發(fā)上辑畦,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音腿倚,去河邊找鬼纯出。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的潦刃。 我是一名探鬼主播侮措,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼乖杠!你這毒婦竟也來了分扎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤胧洒,失蹤者是張志新(化名)和其女友劉穎畏吓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卫漫,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菲饼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了列赎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏悦。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖包吝,靈堂內(nèi)的尸體忽然破棺而出饼煞,到底是詐尸還是另有隱情,我是刑警寧澤诗越,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布砖瞧,位于F島的核電站,受9級(jí)特大地震影響嚷狞,放射性物質(zhì)發(fā)生泄漏块促。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一床未、第九天 我趴在偏房一處隱蔽的房頂上張望竭翠。 院中可真熱鬧,春花似錦薇搁、人聲如沸逃片。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褥实。三九已至,卻和暖如春裂允,著一層夾襖步出監(jiān)牢的瞬間损离,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工绝编, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留僻澎,地道東北人貌踏。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像窟勃,于是被迫代替她去往敵國(guó)和親祖乳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容