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