属性列表、归档、NSUserDefaults

应用沙盒简介

iOS系统为每个应用程序提供了独立的存储空间“沙盒”。

每个应用程序都遵守沙盒机制,即程序仅能访问自身所属沙盒空间内的数据。

沙盒为程序主路径,包含以下目录:

路径获取:

NSFileManager 文件管理类

NSFileManager可以完成沙盒路径下的文件管理工作,包括目录创建、文件创建、删除、移动、复制等。

NSFileManager使用单例方法访问:

+ (NSFileManager *)defaultManager;判断指定路径下是否存在文件:- (BOOL)fileExistsAtPath:(NSString *)path;- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;文件处理方法:// 1、创建文件- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;// 2、创建目录- (BOOL)createDirectoryAtPath:(NSString *)path attributes:(NSDictionary *)attributes;// 3、复制文件- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;// 4、移动文件- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;// 5、删除文件- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;NSUserDefaults+ (NSUserDefaults *)standardUserDefaults;NSUserDefaults 插入数据:- (void)setObject:(id)value forKey:(NSString *)defaultName;- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;- (void)setFloat:(float)value forKey:(NSString *)defaultName;- (void)setDouble:(double)value forKey:(NSString *)defaultName;- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;- (void)setURL:(NSURL *)url forKey:(NSString *)defaultName;NSUserDefaults 读取数据:- (id)objectForKey:(NSString *)defaultName;- (NSInteger)integerForKey:(NSString *)defaultName;- (float)floatForKey:(NSString *)defaultName;- (double)doubleForKey:(NSString *)defaultName;- (BOOL)boolForKey:(NSString *)defaultName;- (NSURL *)URLForKey:(NSString *)defaultName;NSUserDefaults 同步数据到文件系统:- (BOOL)synchronize;属性列表- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;Plist文件创建步骤:Command + N -> ios or OSX -> Resource -> Peoperty List对象归档- (void)encodeWithCoder:(NSCoder *)aCoder;- (id)initWithCoder:(NSCoder *)aDecoder;使用NSKeyedUnarchiver、NSKeyedArchiver将对象归档为NSData写入文件或加载到内存。数据持久化案例界面展示

代码示例Plist代码示例##define NSLOG_DOCUMENTS_PATH NSLog(@”%@”, NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject);/**< 沙盒地址 */#define DOCUMENT_PATH NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject/**< 文件管理类 */#define DEFAULT_FILEMANAGER [NSFileManager defaultManager]static NSString *const plistName= @”/UserInfomation.plist”;static NSString *const dataKey= @”datas”;static NSString *const nameKey= @”name”;static NSString *const addressKey= @”address”;static NSString *const phoneNumberKey = @”phoneNumber”;@interface ViewController ()(strong, nonatomic) IBOutlet UITextField *phoneNumberTextField; ViewController- (void)viewDidLoad {[super viewDidLoad];}#pragma mark – plist/** * 手动创建Plist文件 * * 1、Command + N -》 ios or OSX -》Resource -》Peoperty List * 2、对plist文件数据的操作,如果增加一条数据,key相同则是对原有数据修改 */- (IBAction)plist_save:(UIButton *)sender {if ([self isEmptyData]) {NSLog(@”message is empty, save error!”);return;}// 获取沙盒路径NSArray *sandBoxPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);// 获取完成路径NSString *documentsDirectory = [sandBoxPath objectAtIndex:0];// 获取plist文件路径NSString *plistPath = [documentsDirectory stringByAppendingString:plistName];// 初始化根字典NSMutableDictionary *rootDict = nil;// 初始化存储用户信息数组NSMutableArray *dataList = nil;// 文件管理NSFileManager *fileManager = [NSFileManager defaultManager];// 判断沙盒中是否存在属性列表if ([fileManager fileExistsAtPath:plistPath]) {// 存在// 获取plist文件初始化字典rootDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];// 根据字典里面的键初始化数组if ([rootDict.allKeys containsObject:dataKey]) {dataList = [NSMutableArray arrayWithArray:rootDict[dataKey]];}else{dataList = [NSMutableArray array];}}else{// 沙盒中不存在属性列表// 初始化根字典rootDict = [NSMutableDictionary dictionary];// 初始化数组dataList = [NSMutableArray array];}// 初始化用户信息字典NSMutableDictionary *dictInfomation = [NSMutableDictionary dictionary];// 录入用户信息[dictInfomation setObject:self.nameTextField.text forKey:nameKey];[dictInfomation setObject:self.addressTextField.text forKey:addressKey];[dictInfomation setObject:self.phoneNumberTextField.text forKey:phoneNumberKey];// 将用户姓名作为键,,用户信息作为详情存入一个字典NSDictionary *userInfoDict = @{self.nameTextField.text : dictInfomation};// 将用户信息存入数组[dataList addObject:userInfoDict];// 将存放用户信息的数组放入根字典[rootDict setObject:dataList forKey:dataKey];// 将根字典写入沙盒路劲[rootDict writeToFile:plistPath atomically:YES];NSLog(@”save data success in plist!”);}- (IBAction)plist_read:(UIButton *)sender {// 沙盒路径NSString *sandboxPath = [DOCUMENT_PATH stringByAppendingString:plistName];// 获取bundle路径NSString *bundlePath = [[NSBundle mainBundle] pathForAuxiliaryExecutable:plistName];// 根字典NSMutableDictionary *rootDict = nil;// 文件管理NSFileManager *fileManger = DEFAULT_FILEMANAGER;rootDict = [[NSMutableDictionary alloc] initWithContentsOfFile:sandboxPath];}else{// 没有就从bundle中的属性列表文件初始化rootDict = [[NSMutableDictionary alloc] initWithContentsOfFile:bundlePath];}// 打印字典信息if (((NSMutableArray *)rootDict[dataKey]).count == 0) {NSLog(@”there is no data in plist!”);}else{NSLog(@”plist data = %@”, rootDict[dataKey]);}/*** 这里取到对应的plist字典之后也可直接进行增删改,直接对字典操作就可以了,然后再写入沙盒就OK。*///修改字典,并写入沙盒中,覆盖掉原来的属性列表文件/*[rootDict setObject:(id) forKey:(id<NSCopying>)]; // 添、改[rootDict removeObjectForKey:(id)]; // 删[rootDict writeToFile:sandboxPath atomically:YES]; // 写入沙盒*/}- (IBAction)plist_delete:(UIButton *)sender {// plist沙盒路径NSString *sandboxPath = [DOCUMENT_PATH stringByAppendingString:plistName];NSMutableDictionary *rootDic = [[NSMutableDictionary alloc] initWithContentsOfFile:sandboxPath];// 删除所有元素[rootDic[@”data”] removeAllObjects];[rootDic writeToFile:sandboxPath atomically:YES];NSLog(@”delete data success in plist!”);// 删除整个plist文件/*NSFileManager *fileManager = [NSFileManager defaultManager];if ([fileManager removeItemAtPath:sandboxPath error:nil]) {NSLog(@”plist文件删除成功!”);}*/}#pragma mark – 数据判断/**< 判断 */- (BOOL)isEmptyData{if (self.nameTextField.text.length == 0 || self.addressTextField.text.length == 0 || self.phoneNumberTextField.text.length == 0) {return YES;}else{return NO;}}#pragma mark – responds touches- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {[self.view endEditing:YES];}@endNSUserDefaults代码示例()(- (void)viewDidLoad {[super viewDidLoad];}#pragma mark – userDefaults- (IBAction)userdefaults_save:(UIButton *)sender {// 判断是否为空if ([self isEmptyData]) {NSLog(@”message is empty, save error!”);return;}// 获取NSUserDefaults单例NSUserDefaults *defalusts = [NSUserDefaults standardUserDefaults];// 存值/*[defalusts setObject:self.nameTextField.text forKey:@”name”];[defalusts setObject:self.addressTextField.text forKey:@”address”];[defalusts setObject:self.phoneNumberTextField.text forKey:@”phone”];*/NSMutableArray *datas = [NSMutableArray arrayWithArray:[defalusts objectForKey:@”datas”]];, @, @};if (datas) {[datas addObject:dict];[defalusts setObject:datas forKey:@”datas”];}else{NSArray *datas = @[dict];[defalusts setObject:datas forKey:@”datas”];}// 同步数据[defalusts synchronize];NSLog(@”save data success in defaults!”);}- (IBAction)userdefaults_read:(UIButton *)sender {NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];NSMutableArray *datas = [NSMutableArray arrayWithArray:[defaults objectForKey:@”datas”]];if (datas.count > 0) {NSLog(@”%@”, datas);}else{NSLog(@”there is no data in defaults!”);}}- (IBAction)userdefaults_delete:(UIButton *)sender {NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[defaults removeObjectForKey:@”datas”];[defaults synchronize];NSLog(@”delete data success in defaults!”);}#pragma mark – 数据判断/**< 判断 */- (BOOL)isEmptyData{== == == 0) {return YES;}else{return NO;}}#pragma mark – responds touches- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {[self.view endEditing:YES];}@endArchive对象归档代码示例自定类归档需遵守NSCoding协议,此处对Person类进行归档。只能昏昏沉沉地沿着青草和泥土的气息前进。

属性列表、归档、NSUserDefaults

相关文章:

你感兴趣的文章:

标签云: