设为首页 加入收藏

TOP

数据持久化(一)
2019-08-26 07:03:21 】 浏览:48
Tags:数据 持久化

1.plist文件

即属性列表文件,全名是Property List,这种文件的扩展名为.plist,因此,通常被叫做plist文件。它是一种用来存储串行化后的对象的文件,用于存储程序中经常用到且数据量小而不经常改动的数据。

可以存储的类型:NSNumber,NSString,NSDate,NSData ,NSArray,NSDictionary,BOOL.

不支持自定义对象的存储。

plist的创建方式有两种:command + n 创建和纯代码创建,不同的创建方式使用方法也自然不同。

command + n 创建:

    
  // read bundle's plist
    if let plistPath = Bundle.main.path(forResource: "test", ofType: "plist") {
        var dataDict = NSDictionary(contentsOfFile: plistPath) as! Dictionary<String, Any>
        // var dataArray = NSArray(contentsOfFile: plistPath) as! NSArray
?
        // modify
        dataDict["Int"] = 1
        dataDict["String"] = "hi"
    }

  

纯代码创建:

  // create
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
    let plistPath = documentsPath.appendingPathComponent("test.plist")
    print(plistPath)
?
    // write
    var dict = [String: Any]()
    dict["Int"] = 1
    dict["Bool"] = true
    (dict as NSDictionary).write(toFile: plistPath, atomically: true)
?
    // read
    if let dataDict = NSDictionary(contentsOfFile: plistPath) {
        print(dataDict)
    }

  

需要注意的问题:如果需要存储自定义类型的数据需要先进行序列化。

 

 

2.NSUserDefaults

用于存储用户的偏好设置、用户信息(如用户名、是否自动登录、字体大小等)。

数据自动保存在沙盒的Libarary/Preferences 目录下。

NSUserDefaults将输入的数据储存在.plist格式的文件下,这种存储方式就决定了它的安全性几乎为0,所以不建议存储一些敏感信息如:用户密码、token、加密私钥等。

它能存储的数据类型为:NSNumber(NSInteger、float、double、BOOL),NSString,NSDate,NSArray,NSDictionary,NSData。

不支持自定义对象的存储。

需要注意的问题: 1.NSUserDefaults存储的数据都是不可变的,想将可变数据存入需要先转为不可变才可以存储。

2.NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘。

/// code block:
func testUserDefaults() -> Void {
    let standard = UserDefaults.standard
    standard.set(1, forKey: "Int")
    standard.set(true, forKey: "Bool")
    standard.set(1.0, forKey: "Float")
    standard.synchronize()// 立即存储
?
    if let v_int = standard.object(forKey: "Int") {
        print("\(v_int)")
        // update
        standard.set(2, forKey: "Int")
        // remove
        standard.removeObject(forKey: "Int")
    } else {
        print("not exist")
    }
}

  

 

 

3.钥匙串(keychain)

Keychain在Mac上主要进行一些敏感信息存储使用 如用户名,密码,网络密码,认证令牌, Wi-Fi网络密码,VPN凭证等。 iOS 中 Keychain, 也有相同的功能实现 , 保存的信息存储在设备中, 独立于每个App沙盒之外。

当你删除APP后Keychain存储的数据不会删除,所以在重装App后,Keychain里的数据还能使用。从ios 3.0开始,跨程序分享keychain变得可行而NSUserDefaults存储的数据会随着APP而删掉。

相同的 Team ID 开发, 可实现多个App 共享数据。

使用keychain时苹果官方已经为我们封装好了文件KeychainItemWrapper,引入即可使用。

第三方库SAMKeychain。。。

/// SAMKeychain 简单使用
func testKeychain() -> Void {
    let account = "479377608"
    let service = "com.qq"
    // 检测数据是否已存
    if SAMKeychain.password(forService: service, account: account) != nil {
        print("keychain exist..")
    } else {
        // 存储
        if SAMKeychain.setPassword("123456", forService: service, account: account) {
            print("keychain set success")
        } else {
            print("keychain set failed...")
        }
    }
}

  

 

4.归档(NSKeyedArchiver)

归档是iOS开发中数据存储常用的技巧,归档可以直接将对象储存成文件,把文件读取成对象。

相对于plist或者NSUserDefault形式,归档可以存储的数据类型更加多样,并且可以存取自定义对象。对象归档的文件是保密的,在磁盘上无法查看文件中的内容,更加安全。

遵守NSCod

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[iOS]拾遗补阙 下一篇IOS系统在Safari安装ipa文件

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目