你好,游客 登录 注册 搜索
背景:
阅读新闻

iOS学习 - 数据存储

[日期:2016-04-13] 来源:简书  作者:luoganzhi [字体: ]
  • 一般数据存储到Library/Caches文件夹中,由用户决定是否删除缓存
  • 数据存储

Plist存储

  • 如何判断一个对象能不能plist存储,看看对象有没有writeToFile方法.
  • 获取应用沙盒文件夹方法
    NSString *homeFile = NSHomeDictionary();
  • 获取caches路径
// 获取Cache文件路径
    // NSSearchPathDirectory:搜索的目录
    // NSSearchPathDomainMask:搜索范围 NSUserDomainMask:表示在用户的手机上查找
    // expandTilde 是否展开全路径,如果没有展开,应用的沙盒路径就是~
    // 存储一定要要展开路径

 NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

   // 拼接文件名
    NSString *filePath = [cachePaht stringByAppendingPathComponent:@"personArr.plist"]; 
     // File:文件的全路径
    [arr writeToFile:filePath atomically:YES];
  • plist存储不能存储自定义对象

偏好设置存储(Preference)

  • 好处
    • 不需要关心文件名
    • 快速做键值对存储
  • NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    
      [userDefaults setObject:@"xmg" forKey:@"account"];
      [userDefaults setObject:@"123" forKey:@"pwd"];
      [userDefaults setBool:YES forKey:@"rmbPwd"];
    // 在iOS7之前,默认不会马上把跟硬盘同步
      // 同步
      [userDefaults synchronize];
  • NSString *pwd = [[NSUserDefaults standardUserDefaults] objectForKey:@"pwd"];

自定义对象存储(归档

  • 将自定义对象归档
  • 必须遵守NSCoding协议
  • 实现协议方法

  • 归档

    Person *p = [[Person alloc] init];
      p.age = 18;
    
      // 获取cache
      NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    
      // 获取文件的全路径
      NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.data"];
    
      // 把自定义对象归档
      [NSKeyedArchiver archiveRootObject:p toFile:filePath];
  • 解档

      // 获取cache
      NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    
      // 获取文件的全路径
      NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.data"];
    
      // 解档
      Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
  • 自定义对象

#import "Person.h"

@implementation Person

// 什么时候调用:自定义对象归档的时候

// 作用:用来描述当前对象里面的哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    // name
    [aCoder encodeObject:_name forKey:@"name"];

    // age
    [aCoder encodeInt:_age forKey:@"age"];

}

// 什么时候调用:解档对象的时候调用

// 作用:用来描述当前对象里面的哪些属性需要解档
// initWithCoder:就是用来解析文件的。
- (id)initWithCoder:(NSCoder *)aDecoder
{
    // super:NSObject
#warning 什么时候需要调用initWithCoder 父类遵守NSCoding协议的时候,调用super initWithCoder
    if (self = [super init]) {

        // 注意:一定要给成员变量赋值
        // name
       _name = [aDecoder decodeObjectForKey:@"name"];

        // age
       _age = [aDecoder decodeIntForKey:@"age"];

    }
    return self;


}

@end




收藏 推荐 打印 | 录入:elainebo | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款