iOS数据存储之---归档

来源:互联网 发布:知肤泉水光面膜说明书 编辑:程序博客网 时间:2024/04/29 15:47

归档是利用属性列表的原理来实现的,有系统默认的NSUserDefalts类实现对Object-c2.0中基础类对象实现归档,如果要对自定义的对象进行归档,则该自定义对象还要实现NSCoding协议。

归档是按照键-值对的形式存储于一个文件当中。系统默认的NSUserDefaults类存储在Library目录下,但是只能对object-c中定义的数据类型NSNumber,NSArray,NSDictionary,NSSet,NSDate,NSString归档和解归档。

对于自定义的对象,必须实现协议NSCoding的两个方法:
// --解档的方法
- (id)initWithCoder:(NSCoder *)decoder{
}
// --归档的方法
- (void)encodeWithCoder:(NSCoder *)encoder
}
在这两个方法中分别使用NSCoder类中的编码方法和解码方法对自定义对象进行编码和解码,然后使用如下方法归档和解归档
// --使用NSKeyedArchiver类方法归档
archiveRootObject:toFile:
// --使用NSKeyedUnarchiver类解归档
unarchiveObjectWithFile:
注:对于NSKeyedArchiver类,一个文件中只能归档一个自定义对象和Object-c中的对象。对于NSUserDefaults其实也是一样,它相当于是归档了一个字典NSDictionary

/**
@ NSUserdefaults举例 
*/

// --存储数据
-(void)forNSUserDefaults{
NSString *strOne=@"Persistent data1";
NSString *strTwo=@"Persistent data2";
NSMutableArray *persistentArray=[[NSMutableArray alloc] init];
[persistentArray addObject:strOne];
[persistentArray addObject:strTwo];
NSUserDefaults *persistentDefaults=[NSUserDefaults standardUserDefaults];
[persistentDefaults setObject:persistentArray forKey:@"myDefault"];
NSString *descriptionDefault=[persistentDefaults description];
NSLog(@"NSUserDefaults description is %@",descriptionDefault);
}

//  ---取数据
-(void)forUnNSUserDefaults{
NSUserDefaults *persistentDefaults=[NSUserDefaults standardUserDefaults];
NSArray *unPersistentArray=[persistentDefaults objectForKey:@"myDefault"];
NSString *unStrOne=[unPersistentArray objectAtIndex:0];
NSString *unStrTwo=[unPersistentArray objectAtIndex:1];
NSLog(@"unStrOne= %@,unStrTwo= %@",unStrOne,unStrTwo);
}

/**
@ NSKeyedArchiver和NSKeyedUnarchiver举例
*/
typedef enum{
AccountTypeLecturer ,
AccountTypeAgency
}AccountType;
@interface Account : NSObject<NSCoding>
@property (nonatomic, copy) NSString *phoneNumber;
@property (nonatomic, copy) NSString *password;
@property (nonatomic,copy) NSString * lId;
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *avatarUrl;
@property (nonatomic,copy) NSString *authStatus;
@property (nonatomic,copy) NSString *licencePicPath;
@property (nonatomic,copy) NSString *logoPicPath;
@property (nonatomic,copy) NSString *orgCodePicPath;
@property (nonatomic, assign) AccountType accountType;
- (id)initWithDict:(NSDictionary *)dict;
@end

#import "Account.h"
#define kPhoneNumber @"LoginPhoneNumber"
#define kPassword @"LoginPassword"
#define kId @"lid"
#define kName @"name"
#define kAvatarUrl @"avaterUrl"
#define kAccountType @"accountType"
#define kAuthStatus @"authStatus"

@implementation Account

- (id)initWithDict:(NSDictionary *)dict{
if (self = [super init]) {
self.name = dict[@"name"];
self.avatarUrl = dict[@"avatar"];
self.lId= [NSString stringWithFormat:@"%@",dict[@"id"]];
self.authStatus = dict[@"authStatus"];
self.licencePicPath = dict[@"licencePicPath"];
self.logoPicPath = dict[@"logoPicPath"];
self.orgCodePicPath = dict[@"orgCodePicPath"];
}
return self;

}

- (id)initWithCoder:(NSCoder *)decoder{
if (self = [super init]) {
self.phoneNumber = [decoder decodeObjectForKey:kPhoneNumber];
self.password = [decoder decodeObjectForKey:kPassword];
self.accountType = [[decoder decodeObjectForKey:kAccountType] intValue];
self.lId = [decoder decodeObjectForKey:kId];
self.avatarUrl = [decoder decodeObjectForKey:kAvatarUrl];
self.name = [decoder decodeObjectForKey:kName];
self.authStatus = [decoder decodeObjectForKey:kAuthStatus];
}
return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder{
[encoder encodeObject:self.phoneNumber forKey:kPhoneNumber];
[encoder encodeObject:self.password forKey:kPassword];
[encoder encodeObject:[NSNumber numberWithInt:self.accountType] forKey:kAccountType];
[encoder encodeObject:self.lId forKey:kId];
[encoder encodeObject:self.avatarUrl forKey:kAvatarUrl];
[encoder encodeObject:self.name forKey:kName];
[encoder encodeObject:self.authStatus forKey:kAuthStatus];
}
@end

#define kFilePath [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:kFileName]

#define kCurrentPath [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:kCurrentName]


[NSKeyedArchiver archiveRootObject:currentAccount toFile:kCurrentPath];//将自定义对象归档到一个文件中
[NSKeyedArchiver archiveRootObject:accountList toFile:kFilePath];
//先将多个自定义对象存储到一个数组中,然后将该数组归档到另一个文件中达到在一个文件中存储多个自定义对象的目的
Account *currentAccount = [NSKeyedUnarchiver unarchiveObjectWithFile:kCurrentPath];
NSMutableArray *accountList = [NSKeyedUnarchiver unarchiveObjectWithFile:kCurrentPath];
0 0
原创粉丝点击