1. 程式人生 > >iOS開發中本地資料儲存的 ios登入成功後將使用者的資料儲存到本地 下次開啟應用時不用重複登入了

iOS開發中本地資料儲存的 ios登入成功後將使用者的資料儲存到本地 下次開啟應用時不用重複登入了

// 利用沙盒根目錄拼接”Documents”字串
NSString *homePath = NSHomeDirectory();
NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"];

但是不建議使用這種方法,因為不定哪天蘋果大大就把檔名稱改了呢-_-!

第三種( !~推薦~ !)

// NSDocumentDirectory 要查詢的檔案
// NSUserDomainMask 代表從使用者資料夾下找
// 在iOS中,只有一個目錄跟傳入的引數匹配,所以這個集合裡面只有一個元素
NSString *path = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSString *filePath = [path stringByAppendingPathComponent:@"xxx.plist"];

這裡我來詳細的說下NSSearchPathForDirectoriesInDomains這個方法的幾個引數 :
<#NSSearchPathDirectory directory#> 這個引數代表要查詢的檔案,是個列舉! 列舉你懂的點選去看看就知道了~
<#NSSearchPathDomainMask domainMask#> 這個引數代表從使用者資料夾下找,也是列舉!
最後一個引數如果是NO的話,列印的路徑會是這種形式~/Documents,我們一般都會用YES,這樣可以獲取完整路徑字串!
這個方法的返回值是一個數組,但在iOS中,只有一個目錄跟傳入的引數匹配,所以這個集合裡面只有一個元素,所以我們取第一個元素!

Library/Caches資料夾的獲取方式(跟上面的方法相似)

這裡我只用上面的第三種方法!注意第一個引數!

NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [path stringByAppendingPathComponent:@"student.data"];
tmp資料夾的獲取方式
NSString *tmp= NSTemporaryDirectory();
Library/Preference資料夾的獲取方式

通過NSUserDefaults類存取該目錄下的設定資訊!
!!!這個下面會有介紹!!!

XML屬性列表(plist)歸檔

plist檔案

plist的根Type只能是字典(NSDictionary)或者是陣列(NSArray)所以歸檔時我們只能將陣列或字典儲存到plist檔案中,但是NSString也能通過歸檔儲存到plist檔案中同時它也可以通過stringWithContentsOfFile解檔,它儲存到plist中時Type是空的,Value是有值的!

plist檔案的歸檔
NSArray *arr = [[NSArray alloc] initWithObjects:@"1", @"2", nil];
// NSDocumentDirectory 要查詢的檔案
// NSUserDomainMask 代表從使用者資料夾下找
// 在iOS中,只有一個目錄跟傳入的引數匹配,所以這個集合裡面只有一個元素
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來演示如何儲存使用者設定開關的關閉狀態

儲存使用者偏好設定
// 獲取使用者偏好設定物件
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 儲存使用者偏好設定
[defaults setBool:self.one.isOn forKey:@"one"];
[defaults setBool:self.two.isOn forKey:@"two"];
// 注意:UserDefaults設定資料時,不是立即寫入,而是根據時間戳定時地把快取中的資料寫入本地磁碟。所以呼叫了set方法之後資料有可能還沒有寫入磁碟應用程式就終止了。
// 出現以上問題,可以通過呼叫synchornize方法強制寫入
// 現在這個版本不用寫也會馬上寫入 不過之前的版本不會
[defaults synchronize];
讀取使用者偏好設定
// 讀取使用者偏好設定
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
self.one.on = [defaults boolForKey:@"one"];
self.two.on = [defaults boolForKey:@"two"];

NSKeyedArchiver歸檔(NSCoding)

只有遵守了NSCoding協議的類才可以用NSKeyedArchiver歸檔和NSKeyedUnarchiver解檔,如果物件是NSString、NSDictionary、NSArray、NSData、NSNumber等型別,可以直接用NSKeyedArchiver歸檔和NSKeyedUnarchiver解檔~
下面我舉的�是歸檔解檔一個Student模型,因此該模型應該遵守NSCoding協議

實現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);

這就是我想到的iOS開發中本地資料儲存的幾種方式,希望對大家有幫助~