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

 

 
 
 
 
 
posted @ 2015-08-15 00:37  秦锐IOS  阅读(745)  评论(0编辑  收藏  举报