IOS 数据存储

IOS 数据存储

1. IOS数据存储方式

1.1 IOS 的沙盒机制

1.1.1 IOS 的沙盒机制简介
  • 什么沙盒?

沙盒其实质就是在iOS系统下,每个应用在内存中所对应的储存空间。

  1. 每个iOS应用都有自己的应用沙盒(文件系统目录),与其他文件系统隔离,
  2. 各个沙盒之间相互独立,而且不能相互访问(手机没有越狱的情况下)。
  3. 各个应用程序的沙盒是相互独立的,在系统内存消耗过高时,系统会收到内存警告并自动将一些退出软件。这就保证了系统的数据的安全性及系统的稳定性。
  • 一个应用对应的沙盒目录:
  1. Documents 应用程序在运行时生成的一些需要长久保存的数据。这个目录用于存储用户数据或其它应该定期备份的信息。

  2. Library/Caches 储存应用程序网络请求的数据信息(音视频与图片等的缓存)。此目录下的数据不会自动删除,需要程序员手动清除该目录下的数据。主要用于保存应用在运行时生成的需要长期使用的数据.一般用于存储体积较大数据。

  3. Library/Preferences 设置应用的一些功能会在该目录中查找相应设置的信息,该目录由系统自动管理,通常用来储存一些基本的应用配置信息,比如账号密码,自动登录等。

  4. tmp 保存应用运行时产生的一些临时数据;应用程序退出、系统空间不够、手机重启等情况下都会自动清除该目录的数据,iTunes或iCloud也不会对其进行备份。无需程序员手动清除该目录中的数据。

  5. SystemData - 系统产生的缓存

1.1.2 IOS 的沙盒路径
 // Document 路径
let documentPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask, true)
let documnetPath = documentPaths[0] as! String
 // Library 路径
let libraryPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory,NSSearchPathDomainMask.UserDomainMask, true)
let libraryPath = libraryPaths[0] as! String
 // Cache 路径
let cachePaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory,NSSearchPathDomainMask.UserDomainMask, true)
let cachePath = cachePaths[0] as! String
 // tmp 路径
let tmpDir = NSTemporaryDirectory()  

1.1 常见存储方式

  • Plist 格式文件存储
  • NSUserDefaults 沙盒存储(个人偏好存储)
  • 文件读写储存
  • 解归档存储
  • 数据库存储
  • Keychain 存储(可解决设备唯一标识问题)

1.1.1 Plist 格式文件存储

  • Plist文件的特点
  1. plist文件,即属性列表文件。
  2. 可以存储的数据类型有 Array Dictionary String Boolean Date Data Number。
  3. 常用于储存用户的设置 或 存储项目中经常用到又不经常修改的数据。
    4… 创建 .plist 文件可以使用可视化工具即Xcode ,也可以使用代码。
  4. 不适合存储大量数据,而且只能存储基本数据类型。
  5. 虽然可以实现 :增 删 改 查 等操作,但由于数据的存取必须是一次性全部操作,所以性能方面表现并不好。
  • 文件创建
    文件创建
  • 字符串写入
    字符串写入
  • 数组写入
    数组写入
  • 字典写入
    字典写入
  • 数据读取
    数据读取

1.1.2 NSUserDefaults 沙盒存储(个人偏好存储)

  • 一般来说,我们用来保存的偏好设置都是用 NSUserDefaults中,快速简单。

NSUserDefaults存储的特点

  1. 应用程序启动后,会在沙盒路径Library -> Preferences 下默认生成以工程bundle为名字的 .plist 文件 , 该方式存储的数据即存进该文件当中。
  2. 常用语存储用户的个人偏好设置
  3. 这种方式本质是操作plist文件,所以性能方面的考虑同plist文件数据储存。
  • 使用代码
//1、 保存
 NSUserDefaults .standardUserDefaults().setObject("weNeedSaveValue", forKey: "My_Key")
 NSUserDefaults .standardUserDefaults().setBool(false, forKey: "My_IsOK")
//2、同步 
 NSUserDefaults .standardUserDefaults() .synchronize()
 //3、取值
 NSUserDefaults.standardUserDefaults() .objectForKey("My_Key")

1.1.3 文件读写储存

文件读写特点

  1. 文件操作可通过单例 NSFileManager 处理。文件存储的路径可以代码设置。
  2. 可以存储大量数据,对数据格式没有限制。
  3. 但由于数据的存取必须是一次性全部操作,所以在频繁操作数据方面性能欠缺。

1.1.4 解归档存储

  • 归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上;程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象。

解归档存储的特点:

  1. plist 与 NSUserDefaults(个人偏好设置)两种类型的储存只适用于系统自带的一些常用类型,而且前者必须拿到文件路径,后者也只能储存应用的主要信息。
  2. 对于开发中自定义的数据模型的储存,我们可以考虑使用归档储存方案。
  3. 归档保存数据,文件格式自己可以任意,没有要求 ; 即便设置为常用的数据格式(如:.c .txt .plist 等)要么不能打开,要么打开之后乱码显示。
  4. 值得注意的是使用归档保存的自定义模型需要实现NSCoding协议下的两个方法。
  5. 不适合存储大量数据,可以存储自定义的数据模型。
  6. 虽然归档可以存储自定义的数据结构,但在大批量处理数据时,性能上仍有所欠缺。相对 NSUserDefaults 来说,速度慢些,但是可以保存自定义类型的.
1.1.4.1 归档使用
  1. 首先了解下它所存在的位置上:
var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as NSString 
var filePath = path.stringByAppendingPathComponent("data.archive")
  1. 先自定义一个数据模型
class MyArchiveModel: NSObject,NSCoding {
   
   
    
    var name: String!
    var phone: String!
    var age: NSInteger!
    
    
    func encodeWithCoder(aCoder: NSCoder){
   
   
        aCoder.encodeObject(self.name, forKey: "name")
        aCoder.encodeObject(self.phone, forKey: "phone")
        aCoder.encodeObject(self.age, forKey: "age")
    }
    
    required init(coder aDecoder: NSCoder) {
   
   
        super.init()
        self.name = aDecoder.decodeObjectForKey("name") as! String
        self.phone = aDecoder.decodeObjectForKey("phone") as! String
        self.age = aDecoder.decodeObjectForKey("age") as! NSInteger
    }
    
    override init() {
   
   
        
    }
}
  1. 序列化
//创建一个全局路径,即要保存的位置:
 let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as NSString
 let filePath = path.stringByAppendingPathComponent("my_Arc
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值