首页 > 代码库 > 持久化存储——偏好设置,plist,归档---学习笔记二
持久化存储——偏好设置,plist,归档---学习笔记二
//一. 本地持久化 //1.沙盒 //1.1 应用程序包:存放的是应用程序的源文件,包括资源文件和可执行文件 NSString *path = [[NSBundle mainBundle]bundlePath]; //1.2 Documents:最常用的目录,iTunes同步该应用时会同步此文件夹中的内容,适合存储重要数据 NSString *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject; //1.3 Library //1.3.1 Caches:iTunes不会同步此文件夹,适合存储体积大,不需要备份的非重要数据。 NSString *cachs = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject; //1.4 Preferences:iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息。 //1.5 tmp: iTunes不会同步此文件夹,系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除。 NSString *tmpPath = NSTemporaryDirectory(); //---打印的地址,前往->前往文件夹->输入//Users/xingzai/Library/Developer 就可以进入到当前文件夹下 //二 . Plist 存储 //2.1 plist文件是将某些特定的类,通过XML文件的方式保存在目录中。 //可以被序列化的类型只有如下几种 //-----根目录 //NSArray;//数组 //NSDictionary;//字典 //-----子属性 //NSArray;//数组 //NSDictionary;//字典// NSMutableArray;//可变数组// NSMutableDictionary;//可变字典// NSData;//二进制数据// NSMutableData;//可变二进制数据// NSString;//字符串// NSMutableString;//可变字符串// NSNumber;//基本数据// NSDate;//日期 //2.2 下面以数组为例 //2.2.1存储 NSString *plistPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject; NSArray *arr = @[@{@"1":@"num"},@{@"2":@"num"},@{@"3":@"num"},@{@"4":@"num"},@{@"5":@"num"}]; //stringByAppendingPathComponent是到目录下/,如a/ [arr writeToFile:[plistPath stringByAppendingPathComponent:@"1.plist"] atomically:YES]; //stringByAppendingString 是和当前目录平级的,和a共处一个目录里// [arr writeToFile:[plistPath stringByAppendingString:@"1.plist"] atomically:YES]; //2.2.2 取 NSArray *contentArray = [NSArray arrayWithContentsOfFile:[plistPath stringByAppendingPathComponent:@"1.plist"]]; NSLog(@"%@",contentArray); //三. Preference(偏好设置)// 偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。// 偏好设置是以key-value的方式进行存储和读写,使用到一个单例对象NSUserDefaults //存 NSUserDefaults *keyDefault = [NSUserDefaults standardUserDefaults]; [keyDefault setObject:@"xingZai" forKey:@"name"]; [keyDefault setBool:YES forKey:@"sex"]; [keyDefault setInteger:30 forKey:@"age"]; //立即同步 [keyDefault synchronize]; //取 NSString *name = [keyDefault objectForKey:@"name"]; NSInteger age = [keyDefault integerForKey:@"age"]; BOOL sex = [keyDefault boolForKey:@"sex"]; //oc 的BOOL用%d表示,c的bool用%s表示, NSLog(@"name = %@ age =%ld sex=%d",name,age,sex); // 如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。// 偏好设置会将所有数据保存到同一个文件中,使用同一个key进行存储数据,会覆盖之前存储的数据。 //四 、归档与解档// 归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于绝大多数支持存储数据的类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。 // 1. 遵循NSCoding协议// NSCoding协议声明了两个方法,这两个方法都是必须实现的:// encodeWithCoder:用来说明如何将对象编码到归档中。// initWithCoder:用来说明如何进行解档来获取一个新对象。 // @interface Student : NSObject<NSCoding>// // @property (nonatomic, copy) NSString *name; //名字// @property (nonatomic, assign) BOOL sex; //性别,NO 为女,YES为男// @property (nonatomic, assign) NSInteger age; //年龄// // // @end //#import "Student.h"// // @implementation Student// // //解档 ( decoder 解码器;译码员)// - (instancetype)initWithCoder:(NSCoder *)aDecoder{// // if (self = [super init]) {// self.name = [aDecoder decodeObjectForKey:@"name"];// self.sex = [aDecoder decodeBoolForKey:@"sex"];// self.age = [aDecoder decodeIntegerForKey:@"age"];// }// return self;// }// //归档 (aCoder 归档)// - (void)encodeWithCoder:(NSCoder *)aCoder{// [aCoder encodeObject:self.name forKey:@"name"];// [aCoder encodeBool:self.sex forKey:@"sex"];// [aCoder encodeInteger:self.age forKey:@"age"];// }// @end //2. NSKeyedArchiver归档// 调用NSKeyedArchiver的archiveRootObject:toFile:方法把对象归档 NSString *keyPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject; NSString *file = [keyPath stringByAppendingPathComponent:@"student.data"]; Student *student = [[Student alloc] init]; student.name = @"五宝"; student.sex = YES; student.age = 22; BOOL isSuccess = [NSKeyedArchiver archiveRootObject:student toFile:file]; if (isSuccess) { NSLog(@"写入成功"); } //3. NSKeyedUnarchiver 解档 // 调用 NSKeyedUnarchiver unarchiveObjectWithData: 取出相应的数据 NSString *unkeyPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject; NSString *unfile = [unkeyPath stringByAppendingPathComponent:@"student.data"]; Student *unStudent = [NSKeyedUnarchiver unarchiveObjectWithFile:unfile]; if (unStudent) { self.students = unStudent;// self.students.name = unStudent.name;// self.students.sex = unStudent.sex;// self.students.age = unStudent.age; NSLog(@"unStudent:name=%@ sex=%d age=%ld",self.students.name,self.students.sex,self.students.age); }
持久化存储——偏好设置,plist,归档---学习笔记二
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。