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儲存自定義模型資料就是這麼簡單!