iOS - OC PList数据存储
前言
直接將數(shù)據(jù)寫(xiě)在代碼里面,不是一種合理的做法。如果數(shù)據(jù)經(jīng)常改,就要經(jīng)常翻開(kāi)對(duì)應(yīng)的代碼進(jìn)行修改,造成代碼擴(kuò)展性低。因此,可以考慮將經(jīng)常變的數(shù)據(jù)放在文件中進(jìn)行存儲(chǔ),程序啟動(dòng)后從文件中讀取最新的數(shù)據(jù)。如果要變動(dòng)數(shù)據(jù),直接修改數(shù)據(jù)文件即可,不用修改代碼。一般可以使用屬性列表文件存儲(chǔ) NSArray 或者 NSDictionary 之類(lèi)的數(shù)據(jù),這種 “屬性列表文件” 的擴(kuò)展名是 plist,因此也稱(chēng)為 “plist 文件”。 plist 是以 xml 文件形式存儲(chǔ)的。
如果對(duì)象是 NSString、NSArray、NSDictionary、NSData 和 NSNumber 類(lèi)型,可以用這些類(lèi)中實(shí)現(xiàn)的 writeToFile: atomically: 方法將數(shù)據(jù)寫(xiě)到文件中。
當(dāng)根據(jù)字典創(chuàng)建屬性列表時(shí),字典中的鍵必須都是 NSString 對(duì)象。數(shù)組中的元素或字典中的值可以是 NSString、NSArray、NSDictionary、NSData、NSDate 和 NSNumber 對(duì)象。
iOS 實(shí)現(xiàn)的序列化方式的兩種:NSKeyedArchiver,NSPropertyListSerialization。在這兩種序列化方式中,NSData 都是序列化的目標(biāo)。兩種方式的不同點(diǎn)在于 NSPropertyListSerialization 是針對(duì)數(shù)組和字典類(lèi)型的,而 NSKeyedArchiver 是針對(duì)對(duì)象的。
1、Write 寫(xiě)入方式
永久保存在磁盤(pán)中。具體方法為:
第一步:獲得文件即將保存的路徑:
使用 C 函數(shù) NSSearchPathForDirectoriesInDomains 來(lái)獲得沙盒中目錄的全路徑。該函數(shù)有三個(gè)參數(shù),目錄類(lèi)型、domain mask、布爾值。其中布爾值表示是否需要通過(guò) ~ 擴(kuò)展路徑。而且第一個(gè)參數(shù)是不變的,即為 NSSearchPathDirectory 。在 iOS 中后兩個(gè)參數(shù)也是不變的,即為:NSUserDomainMask 和 YES。
NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];還有一種方法是使用 NSHomeDirectory 函數(shù)獲得 sandbox 的路徑,但是不能在 sandbox 的本文件層上寫(xiě)文件也不能創(chuàng)建目錄,而應(yīng)該是此基礎(chǔ)上創(chuàng)建一個(gè)新的可寫(xiě)的目錄,例如 Documents, Library 或者 temp 。具體的用法為:
// 將 Documents 添加到 sandbox 路徑上NSString *documentPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];這兩者的區(qū)別就是:使用 NSSearchPathForDirectoriesInDomains 比在 NSHomeDirectory 后面添加 Documents 更加安全。因?yàn)樵撐募夸浛赡茉谖磥?lái)發(fā)送的系統(tǒng)上發(fā)生改變。
第二步:生成在該路徑下的文件:
// fileName 就是保存文件的文件名NSString *FileName = [documentPath stringByAppendingPathComponent:@"fileName"];第三步:往文件中寫(xiě)入數(shù)據(jù):
// 將 NSData 類(lèi)型對(duì)象 data 寫(xiě)入文件,文件名為 FileName[data writeToFile:FileName atomically:YES];第四步:從文件中讀出數(shù)據(jù):
// 從 FileName 中讀取出數(shù)據(jù)NSData *data = [NSData dataWithContentsOfFile:FileName options:0 error:NULL];
2、Plist 文件的讀寫(xiě)
NSString *arrayPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/arrayToPList.plist"];NSString *dictionaryPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/dictionaryToPList.plist"];// 待寫(xiě)入數(shù)據(jù)NSArray *array = @[@"bei", @"jing", @"huan", @"ying", @"nin"];// 待寫(xiě)入數(shù)據(jù)NSDictionary *dictionary = @{@"name":@"chen chao", @"age":@"18", @"info":@"Good Teacher"};// 寫(xiě) Plist 文件// 數(shù)組寫(xiě)入 plist 文件BOOL bl1 = [array writeToFile:arrayPath atomically:YES];// 字典寫(xiě)入 plist 文件BOOL bl2 = [dictionary writeToFile:dictionaryPath atomically:YES];// 讀 Plist 文件NSArray *arrayFromPlist = [NSArray arrayWithContentsOfFile:arrayPath];NSDictionary *dicFromPList = [NSDictionary dictionaryWithContentsOfFile:dictionaryPath];3、Plist 序列化
NSString *arrayPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/arrayPropertyList.plist"];NSString *dictionaryPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/dictionaryPropertyList.plist"];// 待寫(xiě)入數(shù)據(jù)NSArray *array = @[@"bei", @"jing", @"huan", @"ying", @"nin"]; // 待寫(xiě)入數(shù)據(jù)NSDictionary *dictionary = @{@"name":@"chen chao", @"age":@"18", @"info":@"Good Teacher"}; // 序列化,將數(shù)據(jù)轉(zhuǎn)換成 XML 格式的文件NSData *arrayData = [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListXMLFormat_v1_0 options:1 error:nil];NSData *dictionaryData = [NSPropertyListSerialization dataWithPropertyList:dictionary format:NSPropertyListXMLFormat_v1_0 options:1 error:nil];// 輸出到 .txt 格式文件中BOOL bl1 = [arrayData writeToFile:arrayPath atomically:YES]; BOOL bl2 = [dictionaryData writeToFile:dictionaryPath atomically:YES];// 反序列化NSArray *arrayFromeFile = [NSArray arrayWithContentsOfFile:arrayPath];NSDictionary *dicitionaryFromeFile = [NSDictionary dictionaryWithContentsOfFile:dictionaryPath];4、Plist 文件的使用
4.1 Plist 文件的創(chuàng)建
4.2 Plist 文件的解析
// 獲得 Plist 文件的全路徑NSString *path = [[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"];// 加載 plist 文件NSArray *shops = [NSArray arrayWithContentsOfFile:path];4.3 Plist 文件的解析過(guò)程
4.4 Plist 的使用注意
plist 的文件名不能叫做 “info”、“Info” 之類(lèi)的。
添加 plist 等文件資源的時(shí)候,一定要勾選下面的選項(xiàng)。
轉(zhuǎn)載于:https://www.cnblogs.com/QianChia/p/5782843.html
總結(jié)
以上是生活随笔為你收集整理的iOS - OC PList数据存储的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jQuery图片提示和文字提示
- 下一篇: ubuntu 14.04使用devsta