iOS-數(shù)據(jù)本地存儲(NSUserDefaults的使用)

前言:

NSUserDefaults適合存儲輕量級的本地數(shù)據(jù),一些簡單的數(shù)據(jù)(NSString類型的)例如密碼,網(wǎng)址等,NSUserDefaults肯定是首選,但是如果我們自定義了一個對象,對象保存的是一些信息,這時候就不能直接存儲到NSUserDefaults了

支持的數(shù)據(jù)類型:

NSUserDefaults支持的數(shù)據(jù)類型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.

簡單的使用方法

如果想要將上述數(shù)據(jù)類型的數(shù)據(jù)永久保存到NSUserDefaults中去,只需要簡單的操作(一個Value 一個Key ),例如,想要保存一個NSString的對象,代碼實現(xiàn)為:

 // 這里只是作為例子,如果應(yīng)用中真的要儲存多個賬號和密碼,儲存在這里安全性不是很高的
    // 創(chuàng)建一個user defaults方法有多個,最簡單得快速創(chuàng)建方法:
    NSUserDefaults *accountDefaults = [NSUserDefaults standardUserDefaults];
    
    // 添加數(shù)據(jù)到 user defaults:
    [accountDefaults setObject:nameField.text forKey:UserDefaultNameKey];
    
    // 也可以添加基本數(shù)據(jù)類型int, float, bool等,有相應(yīng)得方法
    [accountDefaults setBool:YES forKey:UserDefaultBoolKey];
    
    // 從user defaults中獲取數(shù)據(jù):
    [accountDefaults objectForKey:NCUserDefaultNameKey];
    [accountDefaults boolForKey: UserDefaultBoolKey];
注意點:
  • NSUserDefaults非常好用,并不需要用戶在程序中設(shè)置NSUserDefaults的全局變量,需要在哪里使用NSUserDefaults的數(shù)據(jù),那么就在哪里創(chuàng)建一個NSUserDefaults對象,然后進行讀或者寫操作。
  • 針對同一個關(guān)鍵字對應(yīng)的對象或者數(shù)據(jù),可以對它進行重寫,重寫之后關(guān)鍵字就對應(yīng)新的對象或者數(shù)據(jù),舊的對象或者數(shù)據(jù)會被自動清理。
  • 對相同的Key賦值約等于一次覆蓋,要保證每一個Key的唯一性,NSUserDefaults 存儲的對象全是不可變的(這一點非常關(guān)鍵,弄錯的話程序會出bug),例如,如果我想要存儲一個 NSMutableArray 對象,我必須先創(chuàng)建一個不可變數(shù)組(NSArray)再將它存入NSUserDefaults中去,代碼如下:
   NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
    NSArray * array = [NSArray arrayWithArray:mutableArray];
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:array forKey:@"記住存放的一定是不可變的"];
使用 NSUserDefaults 存儲自定義對象(有兩種方案)
一、將自定義類型轉(zhuǎn)換為NSData類型

當數(shù)據(jù)重復而且多的時候(例如想存儲全班同學的學號,姓名,性別(這個數(shù)據(jù)量可能太大了 )),如果不用SQLite 存儲 (多數(shù)據(jù)最好還是用這個),你可以選擇使用歸檔,再將文件寫入本地,但是這種方式和 NSUserDefaults 比起來麻煩多了(因為NSFileManage 本來就挺復雜) ,但是問題是,NSUserDefaults 本身不支持自定義對象的存儲,不過它支持NSData的類型,下面舉一個例子來介紹。
我們先建立一個叫Student 的類,這個類里有三個屬性(學號,姓名,性別),我們要做的就是將Student類型變成NSData類型 ,那么就必須實現(xiàn)歸檔:
這里要實現(xiàn) 在.h 文件中申明 NSCoding 協(xié)議,再 在 .m 中實現(xiàn) encodeWithCoder 方法 和 initWithCoder 方法就可以了 :

#import <Foundation/Foundation.h>
@interface Student : NSObject<NSCoding>
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *number;
@property (copy, nonatomic) NSArray *sex;
@end

在.m文件中實現(xiàn)代理方法

#import "Student.h"

@implementation Student
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder setValue:self.name forKey:@"name"];
    [aCoder setValue:self.number forKey:@"number"];
    [aCoder setValue:self.sex forKey:@"sex"];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.number = [aDecoder decodeObjectForKey:@"number"];
        self.sex = [aDecoder decodeObjectForKey:@"sex"];
    }
    return self;
}
@end
二、將自定義類型數(shù)據(jù)存入 NSUserDefaults 中

如果要存儲全班同學的信息,我們可以建一個NSMutableArray 來存放全班同學的信息(里面存儲的全是NSData對象)在需要存儲的地方加入代碼

 //首先,要建立一個可變數(shù)組來存儲 NSDate對象
    Student *student = [[Student alloc] ini];
    
    //下面進行的是對student對象的 name , studentNumber ,sex 的賦值
    student.name = @"測試名字";
    student.studentNumber = @"010101010101";
    student.sex = @"男";
    
    //這是一個存放全班同學的數(shù)組
    NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:50];
    //將student類型變?yōu)镹SData類型
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];
    //存放數(shù)據(jù)的數(shù)組將data加入進去
    [dataArray addObject:data];
    
    // 如果你只想存一個人的信息,你可以直接將NSData存入NSUserDefaults中 :
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:data forKey:@"oneStudent"];
    
    // 如果你想存儲全班同學的信息,你還要用一個for循環(huán)將data 放入 dataArray中,這里具體的操作就不實現(xiàn)了,只給出存放的代碼:
    //記住要轉(zhuǎn)換成不可變數(shù)組類型
    NSArray * array = [NSArray arrayWithArray:dataArray];
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:array forKey:@"allStudent"];
    
    // 從NSUserDefaults中取出數(shù)據(jù)在還原也很簡單,例如還原一個學生的數(shù)據(jù)
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    NSdData *data = [user objectForKey:@"oneStudent"];
    Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容