IOS数据存储 —— 2 存储方式
IOS数据存储方式
iOS开发常用数据存储方式有:plist、偏好设置 NSUserDefaults、对象归档 NSKeyedArchiver、SQLite3和Core Data
1. plist文件 存储
plist文件通常用于储存用户设置,利用xml属性列表归档NSDictionary、NSArray、NSNumber等类型数据
在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用
注意:plist不能存储自定义对象
2. 偏好设置 NSUserDefaults
偏好设置用来保存“用户名、密码、字体大小、是否自动登录”等设置,主要用于存储应用的设置信息
3. 归档 NSKeydeArchiver
因为前两者都有一个致命的缺陷,只能存储常用的类型。归档可以实现把自定义的对象存放在文件中。
要使用对象归档,对象必须实现NSCoding协议。大部分Object C对象都符合NSCoding协议,也可以在自定义对象中实现NSCoding协议,要实现NSCoding协议
4. SQLite3
SQLite是一款轻型的嵌入式数据库,安卓和ios开发使用的都是SQLite数据库
在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等。
离线缓存一般都是把数据保存到项目的沙盒中,但上述三种方法都有一个致命的缺点,那就是都无法存储大批量的数据,有性能的问题。
如果使用归档,两个问题:
(1)数据的存取都必须是完整的,要求写入的时候要一次性写入,读取的时候要一次性全部读取,这涉及到应用的性能问题。
(2)如果有1000条数据,此时要把第1001条数据存入,那么需要把所有的数据取出来,把这条数据加上去之后,再存入。
说明:以上的三种技术不能处理大批量数据的存储,大批量数据通常使用数据库来进行存储。
5. Core Data
Core Data是对SQLite的封装,因为iOS中使用的SQLite是纯C语言的。
1. plist 文件的存储/读取方法
// 文件路径 NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"data.plist"]; // 设置数据 NSArray *data = @[@"jack", @10, @"abcd"]; // 储存plist [data writeToFile:path atomically:YES]; // 读取 NSArray *data2 = [NSArray arrayWithContentsOfFile: path];
2. 偏好设置 NSUserDefaults
/* 偏好设置——数据存储 类中有相应属性 */ - (void)save { // 1.利用NSUserDefaults,就能直接访问软件的偏好设置(Library/Preferences) NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 2.存储数据 [defaults setObject:@"qr" forKey:@"name"]; [defaults setObject:@"123" forKey:@"pwd"]; [defaults setInteger:10 forKey:@"age"]; [defaults setBool:YES forKey:@"auto_login"]; // 3.立刻同步 [defaults synchronize]; }
/* 偏好设置——读取数据 */ - (void)read { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *account = [defaults objectForKey:@"account"]; BOOL autoLogin = [defaults boolForKey:@"auto_login"]; NSLog(@"%@ -- %d", account, autoLogin); }
3. 对象归档 NSKeyedArchiver
/* 归档——存储自定义对象 */ Person *p = [[Person alloc] init]; p.age = 18; p.name = @"qr"; // 拼接文件名 NSString *path = NSTemporaryDirectory() stringByAppendingPathComponent:@"person.data"]; [NSKeyedArchiver archiveRootObject:p toFile:Path]; // 解档 Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
/* Person 类中要实现的方法 */ // 遵守< NSCoding > 协议 // 什么时候调用:当一个对象要归档的时候就会调用这个方法归档 // 作用:告诉苹果当前对象中哪些属性需要归档 - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeInt:_age forKey:@"age"]; } ———————————————————————————— // 作用:告诉苹果当前对象中哪些属性需要解档 // initWithCoder什么时候调用:只要解析一个文件的时候就会调用 - (id)initWithCoder:(NSCoder *)aDecoder { #warning [super initWithCoder] // 这里不能用[super initWithCoder],什么时候调用[super initWithCoder:aDecoder]:只要父类遵守了NSCoding协议,就调用 if (self = [super init]) { // 解档 // 注意一定要记得给成员属性赋值 _name = [aDecoder decodeObjectForKey:@"name"]; _age = [aDecoder decodeIntForKey:@"age"]; } return self; }
/* 后续给出 */
4. SQLite3
5. Core Data