iOS中数据存储的常用方法

1.XML属性列表plist归档

  • plist文件主要存数组和字典
  • NSHomeDirectory()获取沙盒根目录
  • NSTmporaryDirectory()临时文件夹
  • 可以存自定义对象吗?
    • 自己写的类(Person)是不能存放在plist文件当中的
    • plist文件当中是没有办法存放自定义对象的
    • 数组

      • 获取沙盒目录NSString * path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory/NSCacheDirectory,搜索的范围NSUserDomainMask,是否展开全路径YES)[0]是一个数组,取出第0个数据,
        • 参数
          • NSDocumentDirectory:要搜索的目标
          • NSUserDomainMask:搜索的范围
          • NO/YES:是否展开路径
        • 跨平台C语言的接口,可以在Mac上开发
      • 拼接文件名称 path:stringByAppendingString:@“/array.plist”直接在后面追加
      • stringByAppendingPathComponent:@"array.plist"
      • array writeToFile:atomically:
    • 字典

      • stringByAppendingPathComponent:
      • writeToFile:atomically:
    • 数组

      • path: stringByAppendingPathComponent:@"array.plist"
      • arrayWithContensOfFile:
    • 字典

      • stringByAppendingPathComponent:
      • dictionaryWithContentsOfFile:

2.Preference(偏好设置)

  • 用来存放用户用户的偏好,用户名,密码,版本号
  • NSUserDefault本质就是plist,字典类型的plist文件
  • 保存到同一个plist文件当中
  • 可以存放自定义对象吗?
    • 不能,偏好设置本质是plist文件
  • 创建单例对象 NSUserDefaults * def = [ NSUserDefault standardUserDefaults]
  • [def setObject:@"xmg"forKey:@"name"]
  • [def setInteger:forKey:]
  • [def setBool:forKey:]
  • [def synchronize]立马写入(ios7之后不要这样写)
  • 会自动存放到沙盒文件里的preferences

-

  • NSUserDefaults * def = [ NSUserDefault standardUserDefaults]
  • NSString * name = [def objectForKey:@"name"]
  • [integerForKey:]
  • [def boolForKey:]

3.NSKeyedArchiver归档(NSCoding)

  • 可以存放自定义对象吗?

    • 专门用于存放自定义对象的
  • NSKeyedArchiver会调用保存对象的encodeWithCoder:方法,询问要保存该对象的哪些属性

    • 必须要实现encodeWithCoder:这个方法
      • encodeObject:forKey:
    • 必须要遵守这个协议
  • 获取沙盒目录

    • NSSearchPathForDirectoriesInDomains()[0]
  • 拼接文件名

    • stringByAppendingPathComponent:@“”文件名称以及后缀随遍写
  • NSKeyedArchiver archiveRootObject:对象 toFile:沙盒路径

  • NSKeyedArchiver会调用保存对象的encodeWithCoder:方法,询问要保存该对象的哪些属性

  • 必须要实现encodeWithCoder:这个方法

    • encodeObject:forKey:
  • 必须要遵守这个协议

  • NSKeyedUnarchiver unarchiveObjectWithFile:
  • 当调用NSKeyedUnarchiver时,会调用要保存对象的initWithCoder:询问要取出该对象的哪些属性
  • init开头是一个构造方法
    • self = [super init]
    • [aDecoder decodeObjectForKey:] 把取出的值赋值给对象属性
  • 为什么没有[super initWithCoder]

    • UIView遵守了NSCoding协议
    • NSObject没有遵守NSCoding协议
    • 即父类没有遵守NSCoding协议,所以就不能写出来super initWithCoder
  • initWithCoder:方法什么时候调用

    • 当开始解析一个文件的时候调用
  • awakeFromNib

    • 当解析nib完毕时候调用
  • 控制器销毁了,控制器的view不一定销毁

  • 当使用IBOutlet时用weak,它并不是马上就会释放,内部有一个隐式的强指针对它有一个强引用

4.SQLite3

5.Core Data

  • 苹果对SQLite3的封装
  • 面向对象的存储

你可能感兴趣的:(iOS中数据存储的常用方法)