前言:
在程序開發中,數據層永遠是程序的核心結構之一。對這些數據的加工處理是代碼中能體現技術水平的一大模塊,比如數據的請求、解析、緩存、持久化等等。適當的對數據進行持久化存儲可以實現應用的離線功能,以此提高用戶體驗。
一、簡介
1.數據持久化方式(四種):
- 屬性列表------->(plist)
- 數據歸檔 ------>(NSKeyedValueArchiver/NSUserDefaults)
- 數據庫--------->(sqlite)
- coreData
2.區別:
- 1.屬性列表-plist
簡介:
1.屬性列表是一種XML格式的文件,拓展名為plist
2.plist只能用數組(NSArray)或者字典(NSDictionary)進行讀取,由于屬性列表本身不加密,所以安全性幾乎可以說為零。
3.屬性列表正常用于存儲少量的并且不重要的數據。
4.如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型就可以使用
5.writeToFile:atomically: 方法直接將對象寫到屬性列表文件中
---
優點:像字典一樣的賦值方式方便簡單
缺點: 無法存儲自定義的數據、不加密安全性低 - 2.數據歸檔-NSKeyedArchiver/序列化
1.數據歸檔是進行加密處理的,數據在經過歸檔處理會轉換成二進制數據,所以安全性要遠遠高于屬性列表。
2.使用歸檔方式,我們可以將復雜的對象寫入文件中,并且不管添加多少對象,將對象寫入磁盤的方式都是一樣的。
3.使用NSKeyedArchiver對自定義的數據進行序列化,并且保存在沙盒目錄下。
*(注意:1.使用這種歸檔的前提是讓存儲的數據模型遵守NSCoding協議并且實現其兩個協議方法。
2.當然,如果為了更加安全的存儲,也可以遵守NSSecureCoding協議,這是iOS6之后新增的特性) - 3.數據庫
簡介:
1.sqlite是一個輕量級、跨平臺的小型數據庫
2.擁有可移植性高、有著和MySql幾乎相同的數據庫語句
3.無需服務器即可使用
---
優點:
1.可以存儲大量的數據,存儲和檢索的速度非常快
2.能對數據進行大量的聚合,這樣比起使用對象來進行這些操作要快。
缺點:
1.它沒有提供數據庫的創建方式;
2.它基于C語言框架設計,沒有面向對象的API,所以使用起來比較麻煩;
3.復雜的數據模型的數據建表相對而言比較麻煩。
---
注:當然,我們也可以使用基于sqlite封裝的開源數據庫FMDB來減少使用sqlite的工作量 - 4.coreData
簡介:
1.coreData是蘋果官方iOS5之后推出的綜合型數據庫,其使用了ORM(Object Relational Mapping)對象關系映射技術,將對象轉換成數據,存儲在本地數據庫中。
2.coreData為了提高效率,甚至將數據存儲在不同的數據庫中,且在使用的時候將本地數據放到內存中使得訪問速度更快。
3.我們可以選擇coreData的數據存儲方式,包括sqlite、xml等格式。
4.但也正是coreData 是完全面向對象的,其在執行效率上比不上原生的數據庫。
5.除此之外,coreData擁有數據驗證、undo等其他功能,在功能上是四種持久化方案最多的。
二、基本用法--(歸檔、解檔)
1.屬性列表--plist
應用場景:
最近在實現公司項目業務的時候,需要使用選擇器(UIPickerView)給用戶選擇所在城市。對于城市數據,并沒有加密的必要,
而且這時候使用plist會達到更高一些的效率。既然已經知道需要的數據,那么很容易就得得出省-市這樣的一對多的數據類型,
我們的plist使用字典,將省份作為key,存儲對應的城市的數組作為value。
補充:
實現選擇器的大概思路是用兩個數組分別存儲省份以及當前選中省份的城市數組,
然后在滑動pickerView的回調事件中根據選中的省份更新城市數據源。
---
#注意:詳細過程請參考-參考網站所示。
2.NSUserDefault--偏好設置Preference
簡介:
1. 支持的數據格式有:NSNumber(Integer、Float、Double等)、NSString、NSDate、NSArray(成員必須也是支持的格式類型)、NSDictionary(同NSArray)。
2.其使用和讀取也是非常的簡單,像字典一樣的存取方式。
3. NSUserDefaults 存儲的對象全是不可變的
4.存儲輕量級的本地數據,一些簡單的數據(NSString類型的)例如密碼,網址等,NSUserDefaults肯定是首選。
5.但是如果我們自定義了一個對象,對象保存的是一些信息,這時候就不能直接存儲到NSUserDefaults了
6.本身不支持自定義對象的存儲
#存儲: [[NSUserDefaults standardUserDefaults] setValue: @"str" forKey: @"str"];
#讀取: NSString * str =[[NSUserDefaultsstandardUserDefaults] valueForKey: @"str"];
同樣的也可以使用setObject:forKey:或者objectForKey:等字典存取方法
2.1例子①:
[簡介]:如果想要將上述數據類型的數據永久保存到NSUserDefaults中去,
只需要簡單的操作(一個Value 一個Key ),例如,想要保存一個NSString的對象,
代碼實現為:
//將NSString 對象存儲到 NSUserDefaults 中
NSString *passWord = @"1234567";
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:passWord forKey:@"userPassWord"];
將數據取出也很簡單,只需要取出key 對應的值就好了,
代碼如下:
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *passWord = [ user objectForKey:@"userPassWord"];
#注意:對相同的Key賦值約等于一次覆蓋,要保證每一個Key的唯一性
2.1例子②:使用方法
//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"];
NSLog(@"%@, %d, %ld", name, sex, age);
2.2如果我想要存儲一個 NSMutableArray 對象?
#我必須先創建一個不可變數組(NSArray)再將它存入NSUserDefaults中去。
代碼如下:
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
NSArray * array = [NSArray arrayWithArray:mutableArray];
-
NSUserDefaults user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"記住存放的一定是不可變的"];
#取出數據是一樣的,想要用NSUserDefaults中的數據給可變數組賦值
/-------------------------正確的賦值方法-------------- ----- */
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//可以用alloc 方法代替
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"記住存放的一定是不可變的"]];
- 2.3使用 NSUserDefaults 存儲自定義對象
2.3.1將自定義類型轉換為NSData類型
1.encodeWithCoder 方法 和 initWithCoder 方法
2.應用場景
#具體請過程請參考參考網站2
注意:
1.偏好設置是專門用來保存應用程序的配置信息的,一般不要在偏好設置中保存其他數據。
2.如果沒有調用synchronize方法,系統會根據I/O情況不定時刻地保存到文件中。所以如果需要立即寫入文件的就必須調用synchronize方法。
3.偏好設置會將所有數據保存到同一個文件中。即preference目錄下的一個以此應用包名來命名的plist文件。
3.對象歸檔
簡介:
1.對象歸檔是將對象歸檔以文件的形式保存到磁盤中(也稱為序列化,持久化),使用的時候讀取該文件的保存路徑讀取文件的內容(也稱為接檔,反序列化)。
2.簡單對象歸檔--使用的兩個類:
1).NSKeyedArichiver
2).NSKeyedUnarchiver
代碼實現如下:
NSKeyedArichiver、NSKeyedUnarchiver
NSString *homeDirectory = NSHomeDirectory(); //獲取根目錄
NSString homePath = [homeDirectory stringByAppendingPathComponent:@"自定義文件名,如test.archiver"];
NSArray *array = @[@"abc", @"123", @12];
Bool flag = [NSKeyedArichiver archiveRootObject:array toFile:homePath];
if(flag) {
NSLog(@"歸檔成功!");
}
4.自定義內容歸檔
邏輯思路:
歸檔:
1.使用NSData實例作為歸檔的存儲數據
2.添加歸檔的內容
3.使用鍵值對
4.完成歸檔
解歸檔:
1.從磁盤讀取文件,生成NSData實例
2.根據NSData實例和初始化解歸檔實例解歸檔
3.根據key訪問value
5.SQLIte3
上述方法都有一個致命的缺點,那就是都無法存儲大批量的數據,有性能的問題。
舉例說明:使用歸檔。
(1)數據的存取都必須是完整的,要求寫入的時候要一次性寫入,讀取的時候要一次性全部讀取,這涉及到應用的性能問題。
(2)如果有1000條數據,此時要把第1001條數據存入,那么需要把所有的數據取出來,把這條數據加上去之后,再存入。
6.CoreData
了解:
1.Core Data是蘋果官方推薦使用的數據持久化方式。
2.在使用的過程中,不需要導入數據庫框架,也不需要使用sql語句操作數據庫,完全是按照面向對象的思想,使用實體模型來操作數據庫。
3.在使用的過程中需要注意的是,如果模型發生了變化,可以選擇重新生成實體類文件,但是自動生成的數據庫并不會自動更新,需要考慮重新生成數據庫,
4. Core Data能夠簡化操作,但是它不支持跨平臺使用,如果想實現跨平臺,就需要使用SQLite來進行數據持久化。
- 參考網站:
1.http://www.lxweimin.com/p/33e1d359f123
2.http://my.oschina.net/u/1245365/blog/294449
3.http://www.lxweimin.com/p/99d2b873822c
4.http://www.lxweimin.com/p/4fc6c72b8674
5.http://www.lxweimin.com/p/8ca343c74554
6.http://www.lxweimin.com/p/d124f0ef7cb2
7.http://www.lxweimin.com/p/934a14e6de49
8.http://www.lxweimin.com/p/a6311b6df4dd
9.http://www.lxweimin.com/p/86ea6da905cf