前言
在iOS開發中必不可少的要用到數據存儲,數據的處理是iOS開發中的核心技術,適當的對數據進行持久化存儲可以實現應用的離線功能,以此提高用戶體驗。所謂數據持久化,就是將數據保存到硬盤中,使得在應用程序或手機重啟后可以繼續訪問之前保存的數據。在iOS開發中,有很多持久化得方案,接下來我將總結以下5種持久化方案:
1、plist(屬性列表)
2、preference(偏好設置)
3、NSKeyedArchiver(歸檔)
4、SQList 3 (FMDB)
5、CoreData
由于偏好設置是將所有數據保存到preference目錄下的一個以此應用包名來命名的plist文件中,所以將偏好設置和屬性列表放到一塊介紹。
沙盒機制
- 在介紹各種存儲方法之前,先說明下沙盒機制。iOS應用程序只能在為改程序創建的文件系統中讀取文件,不可以去其他地方訪問,此區域被稱為沙盒,所以所有的非代碼文件都要保持在此,例如圖像,圖標,聲音,屬性列表,文本文件等。
1、目錄結構
1、“應用程序包”
2、Documents
3、Library
Caches
Preferences
4、tmp
2、目錄結構分析- 應用程序包:包含所有的資源文件和可執行文件
NSString *path = [[NSBundle mainBundle] bundlePath];
NSLog(@"%@", path); - Documents:保存應?運行時生成的需要持久化的數據,iTunes同步設備時會備份該目錄。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [path objectAtIndex:0];
NSLog(@"%@", path); - Library/Caches: iTunes不會同步此文件夾,適合存儲體積大,不需要備份的非重要數據。
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
NSLog(@"%@", path); - Library/Preferences: iTunes同步該應用時會同步此文件夾中的內容,通常保存應用的設置信息。
- tmp: iTunes不會同步此文件夾,系統可能在應用沒運行時就刪除該目錄下的文件,所以此目錄適合保存應用中的一些臨時文件,用完就刪除
NSString *path = NSTemporaryDirectory();
NSLog(@"%@", path);
- 應用程序包:包含所有的資源文件和可執行文件
屬性列表(plist)
iOS提供了一種plist格式的文件(屬性列表)用于存儲輕量級的數據,屬性列表是一種XML格式的文件,拓展名為plist。如果對象是NSString、NSDictionary、NSArray、NSData、 NSNumber等類型,就可以使用writeToFile:atomically:?法 直接將對象寫到屬性列表文件中該格式保存的數據可以直接使用NSDictionary和NSArray讀取 。plist文件在iOS開發中屬于Write寫入方式,可以以Property List列表形式顯示,也可以以xml格式顯示。對于數據管理是很方便的。掌握使用plist文件數據操作很有必要
一、將數據寫入plist文件
- 獲取文件路徑
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [path objectAtIndex:0];
NSString *myFile = [docPath stringByAppendingPathComponent:@"test.plist"]; - 存儲
NSArray *array = @[@"123", @"456", @"789"];
[array writeToFile:fileName atomically:YES]; - 讀取
NSArray *result = [NSArray arrayWithContentsOfFile:fileName];
NSDictionary * result = [NSDictionary dictionaryWithContentsOfFile:fileName];
NSLog(@"%@", result);
注意
只有NSString、NSDictionary、NSArray、NSData、 NSNumber等類型才能使用plist文件存儲。
存儲時使用writeToFile: atomically:方法。 其中atomically表示是否需要先寫入一個輔助文件,再把輔助文件拷貝到目標文件地址。這是更安全的寫入文件方法,一般都寫YES。
plist文件的讀寫效率比較高,由于他的讀寫需要將所有的數據取出再全部保存,所以只適合小數據。
二、手動添加plist文件
- 創建.plist文件。
新建文件-->Resource-->Property List
plist文件的根類型只能是NSArray或NSDictionary
可以在空白處右鍵“Add Row”添加數據或者點中“root”行,點擊“+”號即可添加。一般數據類型(Type)可以選擇Array、Dictionary、String等類型。同時也可以給添加的數據賦值(Value)。
除了以Property List列表形式顯示外,選中usersList.plist文件,右鍵“Open As”-“Source Code”可以以XML格式顯示。
- 將plist文件中的數據讀入對應的根類型
//1、獲取文件所在的路徑,Resource:文件名稱、Type:文件格式
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"userInfos" ofType:@"plist"];
// 2、從路徑中獲取對應格式的數據
// 如果Root為NSArray,則使用數組保存
NSArray *infos = [NSArray arrayWithContentsOfFile:filePath];
NSLog(@"%@",infos);
// 如果Root為NSDictionary,則使用字典保存
NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSLog(@"%@",infoDic);
偏好設置
一、使用NSUserDefault 實現持久化
下面來看下 NSUserDefault 本地保存的位置,Library/Preferences 這個目錄下的 plist 文件就是其保存的目錄。
NSUserDefault 的用法,主要是保存和讀取數據
//初始化一個 NSUserDefault
+ (NSUserDefaults *)standardUserDefaults;
//設置數據的方法
- (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
- (void)setFloat:(float)value forKey:(NSString *)defaultName;
- (void)setDouble:(double)value forKey:(NSString *)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
- (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);讀取數據的方法:
- (nullable id)objectForKey:(NSString *)defaultName;
- (nullable NSString *)stringForKey:(NSString *)defaultName;
- (nullable NSArray *)arrayForKey:(NSString *)defaultName;
- (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;
- (nullable NSData *)dataForKey:(NSString *)defaultName;
- (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;
- (NSInteger)integerForKey:(NSString *)defaultName;
- (float)floatForKey:(NSString *)defaultName;
- (double)doubleForKey:(NSString *)defaultName;
- (BOOL)boolForKey:(NSString *)defaultName;
- (nullable NSURL *)URLForKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);刪除數據的方法:
- (void)removeObjectForKey:(NSString *)defaultName;保存數據:
// 如果不手動調用,系統會自動保存,但時間不定
- (BOOL)synchronize;-
使用方法
//1.獲得NSUserDefaults文件 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; //2.向文件中寫入內容 [userDefaults setObject:@"AAA" forKey:@"a"]; [userDefaults setBool:YES forKey:@"sex"]; [userDefaults setInteger:21 forKey:@"age"]; //2.1立即同步 [userDefaults synchronize]; //3.讀取文件 NSString *name = [userDefaults objectForKey:@"a"]; BOOL sex = [userDefaults boolForKey:@"sex"]; NSInteger age = [userDefaults integerForKey:@"age"];
-
存儲id類型數據
+ (void)setValue:(id)value andKey:(NSString *)key { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:value forKey:key]; [userDefaults synchronize]; } // 獲取數據 + (NSString *)getValueByKey:(NSString *)key { NSUserDefaults * settings = [NSUserDefaults standardUserDefaults]; NSString *value = [settings objectForKey:key]; return value; }
注意:
- 偏好設置是專門用來保存應用程序的配置信息的,一般不要在偏好設置中保存其他數據。
- 如果沒有調用synchronize方法,系統會根據I/O情況不定時刻地保存到文件中。所以如果需要立即寫入文件的就必須調用synchronize方法。
- 偏好設置會將所有數據保存到同一個文件中。即preference目錄下的一個以此應用包名來命名的plist文件。
歡迎閱讀下一篇:
iOS-Ant-Bang互助社區 426981364
iOS技術交流群 461069757 歡迎加入!