iOS数据存储持久化(plist,偏好设置,归档)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youyou_56/article/details/78668383

1,plist
使用plist存储数据,首先要指定路径(一般在Document路径下),plist只支持以下的类型:
NSArray;
NSMutableArray;
NSDictionary;
NSMutableDictionary;
NSData;
NSMutableData;
NSString;
NSMutableString;
NSNumber;
NSDate;

2.preference偏好设置(也就是经常说的Userdefault)
偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。
如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。

3.归档
NSCoding协议声明了两个方法,这两个方法都是必须实现的。一个用来说明如何将对象编码到归档中,另一个说明如何进行解档来获取一个新对象。

遵循协议和设置属性
//1.遵循NSCoding协议
@interface Person : NSObject //2.设置属性
@property (strong, nonatomic) UIImage *avatar;
@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) NSInteger age;
@end
实现协议方法
//解档
- (id)initWithCoder:(NSCoder *)aDecoder {
if ([super init]) {
self.avatar = [aDecoder decodeObjectForKey:@”avatar”];
self.name = [aDecoder decodeObjectForKey:@”name”];
self.age = [aDecoder decodeIntegerForKey:@”age”];
}
return self;
}
//归档
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.avatar forKey:@”avatar”];
[aCoder encodeObject:self.name forKey:@”name”];
[aCoder encodeInteger:self.age forKey:@”age”];
}

具体实现
plist
NSString*Path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject
//存储
-(void)SaveDataWithFileName:(NSString )filename InserteNSArray:(NSArray )insertearray{

// NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString *fileName = [Path stringByAppendingPathComponent:filename];

[insertearray writeToFile:fileName atomically:YES];

}
//读取
-(NSArray )seleteDataWithFileName:(NSString )filename{

NSString *fileName = [Path stringByAppendingPathComponent:filename];

NSArray *result = [NSArray arrayWithContentsOfFile:fileName];

return result;

}

偏好设置
-(void)SaveDataWithPreference:(NSDictionary )insertedictionary KeyName:(NSString )keyname{

NSUserDefaults *userdefaults = [NSUserDefaults standardUserDefaults];
[userdefaults setObject:insertedictionary[keyname] forKey:keyname];
[userdefaults synchronize];//最好设置为同步

}
-(NSString )getDataWithPreference:(NSString )keyname{

 NSUserDefaults *userdefaults = [NSUserDefaults standardUserDefaults];
NSString *value = [userdefaults objectForKey:keyname];

return value;

}

扫描二维码关注公众号,回复: 4869839 查看本文章

归档
.h文件
@interface testCoder : NSCoder
@property (nonatomic,copy)NSString *name;
@property (nonatomic,copy)NSString *male;
@property (nonatomic,assign)int age;
@property (nonatomic,strong)NSArray *arr;

@end

.m文件
@implementation testCoder
//解档
- (id)initWithCoder:(NSCoder *)aDecoder {
if ([super init]) {
self.male = [aDecoder decodeObjectForKey:@”male”];
self.name = [aDecoder decodeObjectForKey:@”name”];
self.age = [aDecoder decodeIntForKey:@”age”];
self.arr = [aDecoder decodeObjectForKey:@”arr”];
}

NSLog(@"解档解档解档解档");
return self;

}
//归档
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.male forKey:@”male”];
[aCoder encodeObject:self.name forKey:@”name”];
[aCoder encodeInteger:self.age forKey:@”age”];
[aCoder encodeObject:self.arr forKey:@”arr”];

 NSLog(@"归档归档归档归档");

}

@end

调用
NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@”person.data”];

//存储
for (NSDictionary *dict in array) {

    testCoder *testcoder = [[testCoder alloc] init];
    testcoder.male = dict[@"male"];
    testcoder.name = dict[@"name"];
    testcoder.age = [dict[@"age"]intValue];
    testcoder.arr = array;
    [NSKeyedArchiver archiveRootObject:testcoder toFile:file];
}

//读取
testCoder *person = [NSKeyedUnarchiver unarchiveObjectWithFile:file];

猜你喜欢

转载自blog.csdn.net/youyou_56/article/details/78668383
今日推荐