??我們都用過NSUserDefaults來存儲(chǔ)數(shù)據(jù),它是一個(gè)單例,在整個(gè)程序中只有一個(gè)實(shí)例對象度陆,他可以用于數(shù)據(jù)的永久保存,當(dāng)我們只用來存儲(chǔ)登錄的一些ID等信息的時(shí)候献幔,就沒必要搭建數(shù)據(jù)庫來存儲(chǔ)了懂傀,用NSUserDefaults就夠了,非常簡單實(shí)用蜡感,不必繁瑣的SQL語句蹬蚁,這也是大家喜歡用它保存簡單數(shù)據(jù)的一個(gè)主要原因。
??NSUserDefaults適合存儲(chǔ)輕量級的本地?cái)?shù)據(jù)铸敏,一些簡單的數(shù)據(jù)缚忧,那它具體支持哪些類型呢?
NSUserDefaults支持的數(shù)據(jù)類型有:
- NSNumber(NSInteger杈笔、float闪水、double)
- NSString
- NSData
- NSArray
- NSDictionary
- BOOL
??保存規(guī)則很簡單,如下:
//將NSString 對象存儲(chǔ)到 NSUserDefaults 中
NSString *uid = @"111111";
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject: uid forKey:@"UID"];
??取出通過相應(yīng)的key就行:
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *uid = [user objectForKey:@"UID"];
??值得注意的是:
??1蒙具、key一定要確保唯一性球榆,不然相同的key會(huì)覆蓋之前的值
??2、存儲(chǔ)的一定是不可變的類型禁筏,如果是不可變的一定要轉(zhuǎn)為可變類型存儲(chǔ)持钉,不然報(bào)錯(cuò)
??由此可以看出NSUserDefaults存儲(chǔ)非常簡單,那么問題來了篱昔,要是我需要存儲(chǔ)的數(shù)據(jù)類型上面列舉的沒有呢每强?比如自定義模型始腾。方法是有的,眼尖的同學(xué)看到空执,它支持NSData類型浪箭,是的,我們只需要把自定義模型轉(zhuǎn)為NSData類型存儲(chǔ)就可以了辨绊,那具體該如何轉(zhuǎn)呢奶栖?
??首先在.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; // 手機(jī)號
@end
??我們要將UserModel自定義模型變成NSData類型 ,那么就必須實(shí)現(xiàn)歸檔门坷,首先在.h 文件中申明 NSCoding 協(xié)議宣鄙,再在.m文件中,實(shí)現(xiàn) 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;
}
??至此默蚌,我們就將自定義模型轉(zhuǎn)為NSData類型了冻晤,接下來就是保存到NSUserDefaults了:
UserModel *userModel = [UserModel new];
//賦值
userModel.name = @"松";
userModel.userID = @"136";
userModel.mobile = @"136";
//存儲(chǔ)到NSUserDefaults(轉(zhuǎn)NSData存)
NSData *data = [NSKeyedArchiver archivedDataWithRootObject: userModel];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:data forKey:@"userModel"];
??我們保存的是NSData類型,所有取出的時(shí)候也應(yīng)用NSData類型接收:
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//取出
NSdData *data = [user objectForKey:@"userModel"];
UserModel *model = [NSKeyedUnarchiver unarchiveObjectWithData:data];
??這樣我們就完美的解決了存儲(chǔ)自定義模型的問題了敏簿!當(dāng)然問題可以延伸明也,比如我們存多個(gè)模型呢?一樣的方法惯裕,把模型轉(zhuǎn)成NSData温数,再把NSData放到數(shù)組,再存儲(chǔ)數(shù)組到NSUserDefaults:
-------------------------存儲(chǔ)-----------------------------
NSMutableArray *dataList = [NSMutableArray array];
for (int i = 0;i < 10;i++){
UserModel *userModel = [UserModel new];
//賦值
userModel.name = @"松";
userModel.userID = @"136";
userModel.mobile = @"136";
//存儲(chǔ)到NSUserDefaults
NSData *data = [NSKeyedArchiver archivedDataWithRootObject: userModel];
[dataList addObject: data];
}
//轉(zhuǎn)為不可變數(shù)組
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存儲(chǔ)自定義模型數(shù)據(jù)就是這么簡單撑刺!
聲明: 轉(zhuǎn)載請注明出處http://www.reibang.com/p/3b184f13cc76