1. 程式人生 > >iOS--使用NSUserDefaults儲存自定義模型資料

iOS--使用NSUserDefaults儲存自定義模型資料

我們都用過NSUserDefaults來儲存資料,它是一個單例,在整個程式中只有一個例項物件,他可以用於資料的永久儲存,當我們只用來儲存登入的一些ID等資訊的時候,就沒必要搭建資料庫來儲存了,用NSUserDefaults就夠了,非常簡單實用,不必繁瑣的SQL語句,這也是大家喜歡用它儲存簡單資料的一個主要原因。
  NSUserDefaults適合儲存輕量級的本地資料,一些簡單的資料,那它具體支援哪些型別呢?

NSUserDefaults支援的資料型別有:

  • NSNumber(NSInteger、float、double)
  • NSString
  • NSData
  • NSArray
  • NSDictionary
  • BOOL

  儲存規則很簡單,如下:

//將NSString 物件儲存到 NSUserDefaults 中
NSString *uid = @"111111";
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject: uid forKey:@"UID"];

  取出通過相應的key就行:

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *uid = [user objectForKey:@"UID"];

  值得注意的是:
  1、key一定要確保唯一性,不然相同的key會覆蓋之前的值
  2、儲存的一定是不可變的型別,如果是不可變的一定要轉為可變型別儲存,不然報錯

  由此可以看出NSUserDefaults儲存非常簡單,那麼問題來了,要是我需要儲存的資料型別上面列舉的沒有呢?比如自定義模型。方法是有的,眼尖的同學看到,它支援NSData型別,是的,我們只需要把自定義模型轉為NSData型別儲存就可以了,那具體該如何轉呢?

  首先在.h中定義出模型:

#import <Foundation/Foundation.h>

@interface UserModel : NSObject<NSCoding>

@property (nonatomic, copy) NSString *name;       // 名字
@property (nonatomic, copy) NSString *userID;     // 使用者ID
@property (nonatomic, copy) NSString *mobile;     // 手機號

@end

  我們要將UserModel自定義模型變成NSData型別 ,那麼就必須實現歸檔,首先在.h 檔案中申明 NSCoding 協議,再在.m檔案中,實現 encodeWithCoder 方法 和 initWithCoder 方法:

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self. userID forKey:@"userID"];
    [aCoder encodeObject:self. mobile forKey:@"mobile"];

}

- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {

        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.userID = [aDecoder decodeObjectForKey:@"userID"];
        self.mobile = [aDecoder decodeObjectForKey:@"mobile"];
  
    }
    
    return self;
}

  至此,我們就將自定義模型轉為NSData型別了,接下來就是儲存到NSUserDefaults了:

UserModel *userModel = [UserModel new];
 
//賦值
userModel.name = @"鬆";
userModel.userID = @"136";
userModel.mobile = @"136";

//儲存到NSUserDefaults(轉NSData存)
NSData *data = [NSKeyedArchiver archivedDataWithRootObject: userModel];   
    
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:data forKey:@"userModel"];

  我們儲存的是NSData型別,所有取出的時候也應用NSData型別接收:

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
 
//取出
NSdData *data = [user objectForKey:@"userModel"];
UserModel *model = [NSKeyedUnarchiver unarchiveObjectWithData:data];

  這樣我們就完美的解決了儲存自定義模型的問題了!當然問題可以延伸,比如我們存多個模型呢?一樣的方法,把模型轉成NSData,再把NSData放到陣列,再儲存陣列到NSUserDefaults:

-------------------------儲存-----------------------------
NSMutableArray  *dataList = [NSMutableArray array];

for (int i = 0;i < 10;i++){

    UserModel *userModel = [UserModel new];
 
    //賦值
    userModel.name = @"鬆";
    userModel.userID = @"136";
    userModel.mobile = @"136";

    //儲存到NSUserDefaults
    NSData *data = [NSKeyedArchiver   archivedDataWithRootObject: userModel];   
    
    [dataList addObject: data];
    
}
//轉為不可變陣列
NSArray *array = [NSArray arrayWithArray: dataList];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject: array forKey:@"userModelArray"];

-------------------------取值-----------------------------

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
 
//取出
NSArray *array = [user objectForKey:@"userModelArray"];
for (int i = 0;i < array.count;i++){
    UserModel *model = array[i];
}

  搞定!使用NSUserDefaults儲存自定義模型資料就是這麼簡單!