轉自:http://blog.csdn.net/yudandan10/article/details/38687607
通常程序在運行中或者程序結束之後,需要保存一些信息,而且需要持久化存儲信息,比如登陸信息、視頻播放記錄、收藏記錄等等,那麼我們可以採用以下幾種方式對數據進行持久化保存.
1.文件
2.plist
3.歸檔
4.NSUserDefaults
5.數據庫
【Plist】(文件的一種)
<1> 什麼是plist文件, plist文件的作用
1.plist文件:property list 屬性列表文件,文件的內容只能是 NSString NSNumber NSDate NSData NSArray NSDictionary類的對象內容不能保存其他類型數據
2.作用:對一些登陸註冊信息或者程序的配置信息(小數據)進行持久化存儲
<2> 如何創建plist文件, 如何編輯plist文件
Plist文件內容的格式是XML語法格式
1.Xcode創建
1.點擊File--》New File 彈出一對話框
2.iOS程序選中iOS欄中的Resource/Mac程序選中OS X 欄中的resource
3.點擊Resource中的Property List 創建plist文件
4.點擊文件中的'+'可以添加數據
2.代碼創建
如果要把 NSString NSNumber NSDate NSData NSArray NSDictionary 的對象寫入文件一般就用plist文件
我們需要這些數據保存到一個數組或者字典中,然後調用數組和字典的相關函數把數組NSArray或者字典NSDictionary寫入plist文件
//NSArray和NSDictionary寫文件方法
//YES是保證文件的寫入原子性,就是說會先創建一個臨時文件,直到文件內容寫入成功再導入到目標文件裏.NO是直接寫入
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
<3> 如何在程序中讀取plist文件數據
Plist文件的根節點(數據的最外層)通常是數組或者字典,(字典居多)
如果Plist文件的根節點是字典那麼使用字典的類方法+ (id)dictionaryWithContentsOfFile:(NSString *)path;讀寫Plist文件
如果根節點是數組那麼使用數組的類方法+ (id)arrayWithContentsOfFile:(NSString *)path;讀取Plist文件
注:上述兩個方法只能讀取Plist文件,不能讀取其他格式的文件。
【歸檔】
<1>什麼是歸檔和解檔
1.歸檔(也稱對象序列化)就是通過某種格式把對象保存到本地文件,以便以後讀回該對象的內容
2.解檔(也稱讀檔)就是把歸檔的對象文件讀成原來的對象的過程。
<2>如何歸檔和解檔
1.系統類的歸檔和解檔
// 序列化 數組歸檔
NSArray *array = @[@"xiaohong",@"iOS”,@“123”];
NSString *path = @"/Users/apple/Desktop/data.archive";
BOOL sucess = [NSKeyedArchiver archiveRootObject:array toFile:path];
if (sucess)
{
NSLog(@"歸檔成功");
}else{
NSLog(@"歸檔失敗");
}
// 反序列化 解檔
NSArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@", newArray);
注:1.NSDictionary也可以直接進行歸檔和解檔
2.歸檔的對象包括這個對象中的屬性,它們所屬類的都必須要遵守NSCoding 協議才能歸檔和解檔
2.自定義類的歸檔和解檔
如果自定義的類對象要進行歸檔那麼這個對象的屬性所屬的類也必須要遵守歸檔協議NSCoding
必須實現以下兩個方法:
//歸檔的時候調用的方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeInt:self.age forKey:@”age“];
[aCoder encodeObject:self.name forKey:@“name”];
}
//解歸檔的時候要調用的函數
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init]) {//如果父類也遵守歸檔協議那麼這裏要調用 [super initWithCoder:];
self.age = [aDecoder decodeIntForKey:@“age”];
self.name = [aDecoder decodeObjectForKey:@“name”];
}
return self;
}
歸檔時不一定要直接歸檔到文件,還可以先將他們歸檔成NSData,然後將NSdata進行存儲,用的時候就用這個NSData解檔
NSKeyedArchiver的類方法 + (NSData *)archivedDataWithRootObject:(id)rootObject;
NSKeyedUnarchiver的類方法 + (id)unarchiveObjectWithData:(NSData *)data;
【NSUserDefaults】是一個輕量級的負責本地存儲的單例字典
NSArray *arr = [NSArray arrayWithObjects:@"aa",@"bb", nil];
//一個NSUserDefaults的單例對象(可變字典)
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
//設置內容
[ud setObject:arr forKey:@"a"];
//同步
[ud synchronize];
//讀取內容
NSArray *aaa = [ud objectForKey:@"a"];
【JSON】
<1>.什麼是JSON
JSON是一種輕量級的數據交換格式
JSON 數據的書寫格式是:名稱:值 構成鍵值對。類似於OC的字典中的鍵值對
<2>JSON的基本語法
名稱/值對包括字段名稱(在雙引號中),後面寫一個冒號,然後是值。如 "firstName":"tom"
JSON的值可以是:
1.數字(整數或浮點數)
2.字符串(在雙引號中)
3.邏輯值(true 或 false)
4.數組(在方括號中)
5.對象(在花括號中)
6.null
<3>JSON結構
JSON有數組和字典兩種結構通過這兩種結構可以表示各種複雜的結構
1.數組:數組在js中是中括號“[]”括起來的內容,數據結構爲 ["java","javascript","vb",…],類似於OC中的數組
2.對象:對象在js中表示爲“{}”括起來的內容,數據結構爲 {key:value,key:value,...}的鍵值對的結構,類似於OC中的字典結構
<4>JSON解析
假如本地有一文件內容格式是JSON格式。
1.首先調用+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError**)error;把文件讀成字符串.
2.然後把字符串轉化爲NSData 二進制數據
3.調用 系統類NSJSONSerialization的 + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error; 方法進行解析,最後解析爲NSArray 或者NSDictionary
注:JSON數據的最外層通常是字典或者數組,字典結構居多。使用NSJSONSerialization解析json 數據,解析出來是OC中NSArray 或者NSDictionary