iOS開發(fā)中本地存儲主要有四種形式
- 屬性列表(plist 文件)
- 偏好設置 (NSUserDefault)
- NSKeyedArchiver歸檔(NSCoding)
- 數(shù)據(jù)庫
在這之前先簡單介紹一下 應用沙盒
要想在本地存儲數(shù)據(jù),那就要知道一下什么是應用沙盒 ,其實很好理解應用沙盒就是應用的文件夾氓润,與其他文件系統(tǒng)隔離华坦。每一個iOS應用都有自己的應用沙盒蜡吧,應用必須待在自己的沙盒里钟些,其它應用不能訪問該沙盒桦卒。
現(xiàn)在我們來看看應用沙盒里面這些文件夾都是做什么用的
- Documents** :保存應用運行時生成的需要持久化的數(shù)據(jù)诗箍,iTunes同步設備時會備份該目錄鳖敷。例如脖苏,游戲應用可將游戲存檔保存在該目錄
- Library/Caches** : 保存應用運行時生成的需要持久化的數(shù)據(jù),iTunes同步設備時不會備份該目錄定踱。一般存儲體積大棍潘、不需要備份的非重要數(shù)據(jù)
- Library/Preference** : 保存應用的所有偏好設置,iOS的Settings(設置)應用會在該目錄中查找應用的設置信息崖媚。iTunes同步設備時會備份該目錄
- tmp** : 保存應用運行時所需的臨時數(shù)據(jù)亦歉,使用完畢后再將相應的文件從該目錄刪除。應用沒有運行時畅哑,系統(tǒng)也可能會清除該目錄下的文件肴楷。iTunes同步設備時不會備份該目錄
應用沙盒目錄的常見獲取方式
Documents文件夾的獲取方式(3種)
- 1.第一種(不推薦)
// 利用沙盒根目錄拼接字符串
NSString *homePath = NSHomeDirectory();
NSString *docPath = [homePath stringByAppendingString:@"/Documents"];
- 第二種 (也不推薦)
// 利用沙盒根目錄拼接”Documents”字符串
NSString *homePath = NSHomeDirectory();
NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"];
- 3.第三種 (推薦)
// NSDocumentDirectory 要查找的文件
// NSUserDomainMask 代表從用戶文件夾下找
// 在iOS中,只有一個目錄跟傳入的參數(shù)匹配荠呐,所以這個集合里面只有一個元素
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [path stringByAppendingPathComponent:@"xxx.plist"];
最后一個參數(shù)如果是NO的話赛蔫,打印的路徑會是這種形式~/Documents,我們一般都會用YES泥张,這樣可以獲取完整路徑字符串呵恢!
Library/Caches文件夾的獲取方式(跟上面的方法相似)
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [path stringByAppendingPathComponent:@"student.data"];
tmp文件夾的獲取方式
NSString *tmp= NSTemporaryDirectory();
XML屬性列表(plist)歸檔
plist文件
plist的根Type只能是字典(NSDictionary)或者是數(shù)組(NSArray)所以歸檔時我們只能將數(shù)組或字典保存到plist文件中,但是NSString也能通過歸檔保存到plist文件中同時它也可以通過stringWithContentsOfFile解檔圾结,它保存到plist中時Type是空的瑰剃,Value是有值的!
plist文件的歸檔
NSArray *arr = [[NSArray alloc] initWithObjects:@"1", @"2", nil];
// NSDocumentDirectory 要查找的文件
// NSUserDomainMask 代表從用戶文件夾下找
// 在iOS中筝野,只有一個目錄跟傳入的參數(shù)匹配晌姚,所以這個集合里面只有一個元素
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [path stringByAppendingPathComponent:@"xxx.plist"];
[arr writeToFile:filePath atomically:YES];
plist文件的解檔
NSString *filePath = [path stringByAppendingPathComponent:@"xxx.plist"];
// 解檔
NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
NSLog(@"%@", arr);
Preference(偏好設置)
OC中有一個NSUserDefaults的單例,它可以用來存儲用戶的偏好設置歇竟,例如:用戶名挥唠,字體的大小,用戶的一些設置等焕议,下面我用兩個UISwitch來演示如何保存用戶設置開關的關閉狀態(tài)
保存用戶偏好設置
// 獲取用戶偏好設置對象
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 保存用戶偏好設置
[defaults setBool:self.one.isOn forKey:@"one"];
[defaults setBool:self.two.isOn forKey:@"two"];
// 注意:UserDefaults設置數(shù)據(jù)時宝磨,不是立即寫入,而是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應用程序就終止了唤锉。
// 出現(xiàn)以上問題世囊,可以通過調(diào)用synchornize方法強制寫入
// 現(xiàn)在這個版本不用寫也會馬上寫入 不過之前的版本不會
[defaults synchronize];
讀取用戶偏好設置
// 讀取用戶偏好設置
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.one.on = [defaults boolForKey:@"one"];
self.two.on = [defaults boolForKey:@"two"];
NSKeyedArchiver歸檔(NSCoding)
只有遵守了NSCoding協(xié)議的類才可以用NSKeyedArchiver歸檔和NSKeyedUnarchiver解檔,如果對象是NSString窿祥、NSDictionary株憾、NSArray、NSData晒衩、NSNumber等類型嗤瞎,可以直接用NSKeyedArchiver歸檔和NSKeyedUnarchiver解檔~
實現(xiàn)encodeWithCoder和initWithCoder方法
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.name forKey:@"name"];
[coder encodeInteger:self.age forKey:@"age"];
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
self.age = [coder decodeIntegerForKey:@"age"];
self.name = [coder decodeObjectForKey:@"name"];
}
return self;
}
歸檔
Student *s1 = [[Student alloc] init];
s1.name = @"zzz";
s1.age = 18;
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
// 這個文件后綴可以是任意的,只要不與常用文件的后綴重復即可听系,我喜歡用data
NSString *filePath = [path stringByAppendingPathComponent:@"student.data"];
// 歸檔
[NSKeyedArchiver archiveRootObject:s1 toFile:filePath];
解檔
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [path stringByAppendingPathComponent:@"student.data"];
// 解檔
Student *s = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@----%ld", s.name, s.age);
以上就是OC的幾種存儲方式,做個筆記