數據持久化是iOS開發中必不可少的一項技能。由於開發中咱們多會涉及到用戶信息存儲、文件存儲、應用內容緩存中的一個或者幾個場景。html
數據持久化幾種方式的一覽圖:ios
NSUserDefaults用於存儲用戶的偏好設置和用戶信息,如用戶名,是否自動登陸,字體大小等.
數據自動保存在沙盒的Libarary/Preferences目錄下.
NSUserDefaults將輸入的數據儲存在.plist格式的文件下,這種存儲方式就決定了它的安全性幾乎爲0,因此不建議存儲一些敏感信息如:用戶密碼,token,加密私鑰等!
它能存儲的數據類型爲:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.
不支持自定義對象的存儲.git
使用注意點:github
即屬性列表文件,全名是Property List,這種文件的擴展名爲.plist,所以,一般被叫作plist文件。它是一種用來存儲串行化後的對象的文件,用於存儲程序中常常用到且數據量小而不常常改動的數據。
能夠存儲的類型:NSNumber,NSString,NSDate,NSData ,NSArray,NSDictionary,BOOL.
不支持自定義對象的存儲.數據庫
使用注意點:
若是須要存儲自定義類型的數據須要先進行序列化!緩存
用於本地重要數據的存儲,將數據加密後存儲在本地更安全.如:密碼,祕鑰,序列號等.當你刪除APP後Keychain存儲的數據不會刪除,因此在重裝App後,Keychain裏的數據還能使用。從ios 3.0開始,跨程序分享keychain變得可行而NSUserDefaults存儲的數據會隨着APP而刪掉.
使用keychain時蘋果官方已經爲咱們封裝好了文件KeychainItemWrapper,引入便可使用.固然也但是使用其餘優秀的第三方的封裝,好比ssKeychain。
keychain的使用方法安全
歸檔是iOS開發中數據存儲經常使用的技巧,歸檔能夠直接將對象儲存成文件,把文件讀取成對象。
相對於plist或者userdefault形式,歸檔能夠存儲的數據類型更加多樣,而且能夠存取自定義對象。對象歸檔的文件是保密的,在磁盤上沒法查看文件中的內容,更加安全。
遵照NSCoding協議,並實現該協議中的兩個方法。若是是繼承,則子類必定要重寫那兩個方法。由於子類在存取的時候,會去子類中去找調用的方法,沒找到那麼它就去父類中找,因此最後保存和讀取的時候新增長的屬性會被忽略。須要先調用父類的方法,先初始化父類的,再初始化子類的。
保存數據的文件的後綴名能夠隨意命名。微信
存儲類型 | 安全性 | 文件名後綴 | 數據量大小 | 應用場景 |
---|---|---|---|---|
NSUserDefaults | 不安全 | plist | 小 | 用戶偏好設置,用戶名 |
plist | 不安全 | plist | 小 | 不常常改動 |
keychain | 安全 | 小 | 密碼、祕鑰、序列號 | |
歸檔 | 安全 | 任意 | 大 | 緩存 |
持久化在Document目錄下,通常存儲非機密數據。當App中涉及到電子書閱讀、聽音樂、看視頻、刷圖片列表等時,推薦使用沙盒存儲。由於這能夠極大的節約用戶流量,並且也加強了app的體驗效果.Application:存放程序源文件,上架前通過數字簽名,上架後不可修改。網絡
Documents: 保存應運行時生成的須要持久化的數據,iTunes同步設備時會備份該目錄。例如,遊戲應用可將遊戲存檔保存在該目錄。多線程
tmp: 保存應運行時所需的臨時數據,使⽤完畢後再將相應的文件從該目錄刪除。應用沒有運行時,系統也可能會清除該目錄下的文件。iTunes同步設備時不會備份該目錄。
Library/Caches: 保存應用運行時生成的須要持久化的數據,iTunes同步設備時不會備份該目錄。通常存儲體積大、不須要備份的非重要數據,好比網絡數據緩存存儲到Caches下。
Library/Preference: 保存應用的全部偏好設置,如iOS的Settings(設置) 應會在該目錄中查找應⽤的設置信息。iTunes同步設備時會備份該目錄。
存儲數據量較大的數據,通常使用數據庫來存儲。如:FMDB、CoreData、Realm、WCDB。
FMDB是iOS平臺的SQLite數據庫框架,FMDB以OC的方式封裝了SQLite的C語言API,使用起來更加 面向對象,省去了不少麻煩、冗餘的C語言代碼,對比蘋果自帶的Core Data框架,更加輕量級和靈活,提供了 多線程安全的數據庫操做方法,有效地防止數據混亂.
Core Data是iOS5以後纔出現的一個框架,它提供了 對象-關係映射(ORM)的功能,即可以將OC對象轉化成數據,保存在SQLite數據庫文件中,也可以將保存在數據庫中的數據還原成OC對象。在此數據操做期間,咱們不須要編寫任何SQL語句.可是直接操做CoreData顯的不是那麼容易,因此我多數的時候會使用 MagicRecord來實現.MagicRecord是對CoreData的二次封裝,使用起來簡單操做方便.
WCDB是微信移動端開源的數據庫組件。
WCDB的使用介紹
WCDB的詳細介紹
WCDB 的GitHub傳送門
本文主要是對iOS開發過程當中使用到的數據持久化方案的一個概括整理,有些其實我本身也沒有具體使用過,可是附上了相應的連接,有須要的同窗能夠具體的去學習。