就以一片plist的操作開始吧!
一砸紊、今天寫plist文件苛谷,發(fā)現(xiàn)沒有寫進(jìn)去盗忱,后來查了才發(fā)現(xiàn)問題所在:
原文鏈接:http://stackoverflow.com/questions/7628372/ios-how-to-write-a-data-in-plist
二、plist的基本操作
plist的保存位置
1屉栓,工程沙盒里(就是程序user Document文件夾下舷蒲,以讀取文件,寫入文件方式)
2友多,工程自身里(就是在工程里手動創(chuàng)建一個如.plist文件牲平,把固定的內(nèi)容寫入,這個需要人工手動寫入)
3域滥,工程沙盒里(保存到user Document下纵柿,不過不需要讀寫文件,用系統(tǒng)的?NSUserDefaults 可以快速保存添加讀取刪除基本數(shù)據(jù)類型启绰,類似于android里的Sharedpreferences?)
先看截圖吧
控制臺輸出的為工程下plist文件和沙盒文件的路徑昂儒,通過截圖我們可以看到,前綴都是統(tǒng)一的委可,只是到了程序的文件夾后渊跋,一個是appname.app,另一個是Documents下着倾。所以存放位置還是不一樣的拾酝。
首先說一下,工程下的.plist是我們不能在代碼中寫入的,可以讀取卡者,但是不可以寫入(目前我是這樣的結(jié)論蒿囤,猜測應(yīng)該是apple為了安全限制的),所以崇决,代碼中進(jìn)行文件寫等操作只能在沙盒路徑下的文件中操作材诽。
(程序常用固定數(shù)據(jù)镶摘,比如離線地圖數(shù)據(jù),各城市經(jīng)緯度信息等需要我們綁定到程序里(比UserDocument安全)岳守,那么凄敢,可以代碼循環(huán)寫入,把.plist寫在沙盒內(nèi)湿痢,然后手動copy到工程目錄下涝缝,這樣就不用我們手動添加啦)
讀寫操作:
1-1,創(chuàng)建plist文件譬重。
按command +N快捷鍵創(chuàng)建拒逮,或者File —> New —> New File,選擇Resource下的Property List
1-2臀规,工程路徑plist文件讀取滩援。
[cpp]view plaincopy
//path?讀取當(dāng)前程序定義好的provinces.plist省份城市文件
NSString?*path?=?[[NSBundle?mainBundle]?pathForResource:@"provinces"ofType:@"plist"];
NSDictionary?*data?=?[NSDictionary?dictionaryWithContentsOfFile:path];
self.provincesContent?=?[NSArray?arrayWithArray:[data?objectForKey:@"province"]];//array數(shù)組的名稱就叫province
1-3,讀取后賦值給我們相應(yīng)的數(shù)據(jù)類型塔嬉,就可以直接使用了玩徊,就是這么簡單。
2-1谨究,沙盒路徑plist文件的讀取恩袱。
[cpp]view plaincopy
NSArray?*patharray?=?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES);
NSString?*path?=??[patharray?objectAtIndex:0];
NSString?*filepath=[path?stringByAppendingPathComponent:@"provinces.plist"];//添加我們需要的文件全稱
//獲取此路徑下的我們需要的數(shù)據(jù)(NSArray,NSDictionary,NSString...)
NSMutableArray?*rootArray?=?[NSMutableArray?arrayWithContentsOfFile:filepath];//注意,如果想添加新的數(shù)據(jù)胶哲,需要NSMutable類型的
2-2畔塔,如果document里沒有此文件,會自動創(chuàng)建鸯屿,讀取賦值后澈吨,便可使用,同時可以add寄摆,update谅辣,和remove,具體看上面的截圖冰肴,一目了然屈藐。
3-1,NSUserDefaults快速讀寫熙尉,利用系統(tǒng)提供的方法联逻,我們可以快速保存簡單數(shù)據(jù)類型,如用戶登錄用戶名密碼检痰。
[cpp]view plaincopy
NSUserDefaults?*defaults?=?[NSUserDefaults?standardUserDefaults];//獲取標(biāo)準(zhǔn)函數(shù)對象
NSMutableDictionary?*defaultcoordinate?=?[defaults?objectForKey:@"default_coordinate"];//通過對象獲取名稱下NSMutableDictionary數(shù)據(jù)
NSString?*currentCity?=?[defaultcoordinate?objectForKey:@"c_name"];
3-2包归,增刪改,一看便會铅歼。
[cpp]view plaincopy
[defaults?setObject:@"kaka"forKey:@"newdata"];//添加id對象類型數(shù)據(jù)
[defaults?objectForKey:@"newdata"];//獲取對象類型數(shù)據(jù)
[defaults?setDouble:2013?forKey:@"double"];//添加double類型數(shù)據(jù)
[defaults?doubleForKey:@"double"];//獲取double類型數(shù)據(jù)
[defaults?setBool:NO?forKey:@"BOOL"];//添加BOOL類型數(shù)據(jù)
[defaults?boolForKey:@"BOOL"];//獲取BOOL類型數(shù)據(jù)
[defaults?setInteger:12?forKey:@"int"];//添加int類型數(shù)據(jù)
[defaults?integerForKey:@"int"];//獲取int類型數(shù)據(jù)
[defaults?setFloat:0.23?forKey:@"float"];//添加Float類型數(shù)據(jù)
[defaults?floatForKey:@"float"];//獲取float類型數(shù)據(jù)
[defaults?removeObjectForKey:@"newdata"];//刪除對象數(shù)據(jù)
3-3公壤,操作之后記得Synchronize同步操作换可,否則偶然會因為別的線程占大量內(nèi)存而沒有保存成功
[cpp]view plaincopy
[defaults?synchronize];