本人ios初學(xué)者往衷,為自己學(xué)習(xí)方便阵谚,復(fù)制各位大神的學(xué)習(xí)性文章放在自己簡書里蚕礼,僅作為自己學(xué)習(xí)方便使用,如果作者疑此行為侵權(quán)梢什,請隨時聯(lián)系本人刪除奠蹬,如有共同學(xué)習(xí)者復(fù)制此文章,請注明原出處
在現(xiàn)實的應(yīng)用程序當(dāng)中嗡午,數(shù)據(jù)持久化是一個很重要的功能囤躁。數(shù)據(jù)持久化能夠?qū)⒂脩魧?yīng)用程序的修改很好的保存起來,這樣用戶才能夠看到自己的更改。
將數(shù)據(jù)持久存儲在iOS設(shè)備上有多種方式狸演,目前常用的四種機制分別是:
屬性列表(P)
對象歸檔
SQLite3
Core Data
今天我們將要介紹的是屬性列表的使用:
屬性列表序列化
序列化對象(serialized ovject)是指可以被轉(zhuǎn)換為字節(jié)流以便于存儲到文件中或通過網(wǎng)絡(luò)進行傳輸?shù)膶ο笱陨摺V挥腥缦录蠴C類才能夠用writeToFile(, atomically: )方法將它們存儲到屬性列表中。
NSArray
NSMutableArray
NSDictionary
NSMutableDictionary
NSData
NSMutableData
NSString
NSMutableString
NSNumber
NSDate
使用屬性列表持久保存應(yīng)用程序數(shù)據(jù)宵距,則可用其writeToFile方法來寫入屬性列表腊尚,如下所示:
meArray.writeToFile("output.plist",atomically:true)
因此,屬性列表是最簡單的數(shù)據(jù)存儲方案满哪,一般用于簡單的應(yīng)用程序或者存儲簡單數(shù)據(jù)的復(fù)雜程序中婿斥。
下面讓我們一起來使用屬性列表來創(chuàng)建一個簡單的應(yīng)用程序,這個應(yīng)用程序?qū)捎米钚碌膕wift語言。
實例
創(chuàng)建名為PersistenceDemo的新工程哨鸭,取消Use Core Data,選擇swift語言受扳。
Snip20140925_1.png
創(chuàng)建一個TextField文本框和一個button按鈕
Snip20140925_2.png
將文本框以及按鈕進行輸出關(guān)聯(lián)(按住control鍵將控件拖到ViewControll.swift文件中),文本框選擇Outlet兔跌,按鈕選擇Action勘高,此時,ViewControl.swift中顯示如下:
@IBOutletvartextfield:UITextField!
@IBActionfuncbuttonPush(sender: AnyObject){? ?
}
在ViewControl.swft文件中坟桅,我們添加一個名為filePath的函數(shù):
func filePath(filename:NSString) ->NSString{? ?
var mypaths:NSArray=NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask,true)??
var mydocpath:NSString= mypaths.objectAtIndex(0) asNSStringvar filepath = mydocpath.stringByAppendingPathComponent(filename)
return filepath
}
這個函數(shù)首先是獲取Documents目錄华望,每個程序都有自己的Documents文件夾,并且它們僅僅只能讀寫自己的Documents文件夾中的內(nèi)容仅乓,這也是我們數(shù)據(jù)存儲的地方赖舟。那么如何檢索Documents目錄的完整路徑呢?這里我們使用C函數(shù)NSSearchPathForDirectoriesInDomain()來查找各種目錄夸楣。
這個函數(shù)中的常量NSSearchPathDirectory.DocumentDirectort表明我們正在查找Documents目錄的路徑(NSSearchPathDirectory中還有其他的目錄路徑宾抓,感興趣的讀者可以前去看一看);第二個常量NSSearchPathDomainMask.UserDomainMask表明我們希望將搜索限制在應(yīng)用程序的沙盒內(nèi)豫喧。
雖然這個函數(shù)返回了一個匹配路徑的數(shù)組石洗,但是我們知道數(shù)組中位于索引0處的一定是Documents目錄,因為每個應(yīng)用程序僅有一個Documents目錄紧显,因此只有一個目錄符合指定的檢索條件讲衫。
之后,我們在剛剛檢索到的路徑尾巴后面附上另外一個字符串來創(chuàng)建文件名孵班,這就要使用stringByAppendingPathComponent方法.
完成此調(diào)用之后涉兽,filePath()這個函數(shù)就是返回應(yīng)用程序的Documents目錄中的filename文件的完整路徑了,這個時候我們就可以來創(chuàng)建篙程、讀取文件了枷畏。
那么下面我們來實現(xiàn)存儲數(shù)據(jù)的功能。
在之前創(chuàng)建的按鈕動作函數(shù)中(@IBAction func buttonPush(sender: AnyObject))虱饿,我們添加如下代碼:
var filename:NSString=self.filePath("properties.plist")
NSLog(filename)
var data:NSMutableArray=NSMutableArray()
data.addObject(textfield.text)
data.writeToFile(filename, atomically:true)
filename是用來獲取之前我們創(chuàng)建的filePath函數(shù)所返回的文件路徑拥诡。
然后我們將文本框中的數(shù)據(jù)存儲在一個名為data的多維數(shù)組中丹允,然后將數(shù)據(jù)寫入該文件。是不是很簡單呢袋倔?
那么最后一步雕蔽,實現(xiàn)讀取功能:
在ViewDidLoad()方法中,我們添加如下代碼:
var filename:NSString=self.filePath("properties.plist")
if NSFileManager.defaultManager().fileExistsAtPath(filename) {? ?
var data:NSArray=NSArray(contentsOfFile: filename)? ?
textfield.text= data.objectAtIndex(0) as String
}
首先我們先檢查數(shù)據(jù)文件是否存在宾娜,如果不存在那么就不加載它批狐;如果存在,就用該文件的內(nèi)容實例化數(shù)組前塔,然后將數(shù)組中的對象復(fù)制到文本框中嚣艇。
下面你就可以運行程序,來看一看數(shù)據(jù)存儲帶來的驚喜了华弓!