iOS本地數(shù)據(jù)保存有多種方式,歸納如下:
保存到KeyChain (鑰匙串) |
存儲為文件 | 存儲到數(shù)據(jù)庫 |
---|---|---|
保存到沙盒范圍以外的地方价涝,與沙盒無關 | 包括:歸檔剂桥、plist文件存儲,偏好設置;歸檔或者plist文件存儲可以選擇保存到沙盒中簇宽,而偏好設置系統(tǒng)已經規(guī)定只能保存到沙盒的 | SQLite,Core Data; |
本章不僅是學習多種數(shù)據(jù)存儲方式惜互,也可學習到其他知識點蜜托,下面就讓我們詳細來看:
儲存為文件
- Write寫入方式(這里需要注意多種不同的寫入方式,作為其中一個知識點微酬,處理不好很多同學容易出錯):只能存儲常用的類型绘趋。
具體方法為:
第一步:獲得文件即將保存的路徑,并生成在該路徑下的文件:
NSString *myDocumentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString *zhigangPath = [myDocumentPath stringByAppendingPathComponent:@"zhigang.plist"];
NSArray *array =@[@"study",@"love",@"zhigang"];
第二步:往文件中寫入/讀瓤殴堋:
方法一:
[array writeToFile:zhigangPath atomically:YES]寫入;
NSArray * data = [NSArray arrayWithContentsOfFile:zhigangPath]讀取;
方法二:
NSURL *urlPath = [NSURL fileURLWithPath:zhigangPath];
[array writeToURL:urlPath atomically:YES];
NSArray * data = [NSArray arrayWithContentsOfURL:urlPath];
方法三:
NSString*fileURL =[@"file://" stringByAppendingString:zhigangPath];
NSURL*anthorUrlPath = [NSURL URLWithString:fileURL];
[array writeToURL:urlPath atomically:YES];
NSArray * data = [NSArray arrayWithContentsOfURL:anthorUrlPath];
解釋下:文中用了fileURLWithPath以及URLWithString兩種不同方法陷遮,我們要分清楚URL和路徑的不同;URL是包含協(xié)議頭 + 主機地址 +資源路徑,如果訪問的資源是本機的,那么主機地址可以省略;而路徑是不用包含協(xié)議頭和主機地址的; 用fileURLWithPath方法包含了"file://"協(xié)議頭,而使用URLWithString創(chuàng)建的URL,與原有的字符串一模一樣;故:
當我們需要根據(jù)一個字符串創(chuàng)建URL的時候,如果這個字符串包含協(xié)議頭,那么使用URLWithString,一般用于網絡資源的URL創(chuàng)建;如果訪問的是本地資源,而且不包含協(xié)議頭,使用fileURLWithPath創(chuàng)建URL垦江。
2.NSUserDefaults:是一個單例對象帽馋,在整個應用程序的生命周期中都只有一個實例。用來保存應用程序設置和屬性、用戶保存的數(shù)據(jù)绽族。存儲在沙盒的Library/Preference中姨涡,NSUserDefaults可以存儲的數(shù)據(jù)類型包括:NSData、NSString吧慢、NSNumber涛漂、NSDate、NSArray检诗、NSDictionary匈仗。寫入和讀取都比較簡單,如下:
寫入:
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setObject:@"123" forKey:@"zhigang"];
[userDefault synchronize];
```
讀确昊拧:
NSString *str = [userDefault objectForKey:@"zhigang"];
3.NSKeyedArchiver:采用歸檔的形式來保存數(shù)據(jù)悠轩,可歸檔自定義對象,該數(shù)據(jù)對象需要遵守NSCoding協(xié)議攻泼,并且該對象對應的類必須提供encodeWithCoder:和initWithCoder:方法火架。前一個方法告訴系統(tǒng)怎么對對象進行編碼,而后一個方法則是告訴系統(tǒng)怎么對對象進行解碼忙菠。*(注意對NSInteger何鸡,NSString的不同操作;)*
** 單個對象歸檔:**
@interface Person : NSObject <NSCoding>//遵守NSCoding協(xié)議
@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) NSInteger age;
@end
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInteger:_age forKey:@"age"];
} - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
_name = [aDecoder decodeObjectForKey:@"name"];
_age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}]
歸檔操作:
只需要NSCoder子類NSKeyedArchiver的方法archiveRootObject:toFile: 即可
[NSKeyedArchiver archiveRootObject:person toFile:path];]
解檔操作:
同樣調用NSCoder子類NSKeyedArchiver的方法unarchiveRootObject:toFile: 即可
[NSKeyedUnarchiver unarchiveObjectWithFile:path];
** 多個對象歸檔:**
對多個對象進行歸檔只搁,需使用NSData來進行歸檔對象
NSData可以為一些數(shù)據(jù)提供臨時存儲空間音比,以便隨后寫入文件,或者存放從磁盤讀取的文件內容氢惋《呆妫可以使用[NSMutableDatadata]創(chuàng)建可變數(shù)據(jù)空間;

NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
[archiver encodeObject:person forKey:@"person"];
[archiver encodeObject:bir forKey:@"bir"];
// 存檔完畢(一定要調用這個方法)
[archiver finishEncoding];
[data writeToFile:path atomically:YES];
NSData *undata = [NSData dataWithContentsOfFile:path];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
[unarchiver decodeObjectForKey:@"person"];
[unarchiver decodeObjectForKey:@"bir"];
// 恢復完畢
[unarchiver finishDecoding];
通過代碼基本上發(fā)現(xiàn)其實存檔和解壓是非常簡單的一個事情焰望,不過事實這種方式缺點還是很明顯的骚亿,以這種方式保存數(shù)據(jù)只能一次性歸檔保存以及一次性解壓。數(shù)據(jù)較少的時候如果使用感覺比較方便熊赖,數(shù)據(jù)量過多的時候如果想修改其中的某一條来屠,解壓整個數(shù)據(jù)然后歸檔整個數(shù)據(jù)還是比較耗時的。
#####存儲到數(shù)據(jù)庫