iOS - Swift PList 数据存储

前言

  • 直接将数据写在代码里面,不是一种合理的做法。如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低。因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据。如果要变动数据,直接修改数据文件即可,不用修改代码。一般可以使用属性列表文件存储 NSArray 或者 NSDictionary 之类的数据,这种 “属性列表文件” 的扩展名是 plist,因此也称为 “plist 文件”。 plist 是以 xml 文件形式存储的。
  • 如果对象是 NSString、NSArray、NSDictionary、NSData 和 NSNumber 类型,可以用这些类中实现的 writeToFile: atomically: 方法将数据写到文件中。
  • 当根据字典创建属性列表时,字典中的键必须都是 NSString 对象。数组中的元素或字典中的值可以是 NSString、NSArray、NSDictionary、NSData、NSDate 和 NSNumber 对象。
  • iOS 实现的序列化方式的两种:NSKeyedArchiver,NSPropertyListSerialization。在这两种序列化方式中,NSData 都是序列化的目标。两种方式的不同点在于 NSPropertyListSerialization 是针对数组和字典类型的,而 NSKeyedArchiver 是针对对象的。

1、Write 写入方式

  • 永久保存在磁盘中。具体方法为:

    • 第一步:获得文件即将保存的路径:

      • 使用 C 函数 NSSearchPathForDirectoriesInDomains 来获得沙盒中目录的全路径。该函数有三个参数,目录类型、domain mask、布尔值。其中布尔值表示是否需要通过 ~ 扩展路径。而且第一个参数是不变的,即为 NSSearchPathDirectory 。在 iOS 中后两个参数也是不变的,即为:.DocumentDirectory 和 true。

            let documentPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
      • 还有一种方法是使用 NSHomeDirectory 函数获得 sandbox 的路径,但是不能在 sandbox 的本文件层上写文件也不能创建目录,而应该是此基础上创建一个新的可写的目录,例如 Documents, Library 或者 temp 。具体的用法为:
            // 将 Documents 添加到 sandbox 路径上
            let documentPath = NSHomeDirectory().stringByAppendingString("/Documents")
      • 这两者的区别就是:使用 NSSearchPathForDirectoriesInDomains 比在 NSHomeDirectory 后面添加 Documents 更加安全。因为该文件目录可能在未来发送的系统上发生改变。
    • 第二步:生成在该路径下的文件:

      objc // fileName 就是保存文件的文件名 let FileName = documentPath.stringByAppendingString("/fileName")

    • 第三步:往文件中写入数据:
          // 将 NSData 类型对象 data 写入文件,文件名为 FileName
          data.writeToFile(FileName, atomically: true)
    • 第四步:从文件中读出数据:
          // 从 FileName 中读取出数据
          let data = try? NSData(contentsOfFile: FileName, options: NSDataReadingOptions(rawValue: 0))

2、Plist 文件的读写

    let arrayPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/arrayToPList.plist")
    let dictionaryPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/dictionaryToPList.plist")

    // 待写入数据
    let array:NSArray = ["bei", "jing", "huan", "ying", "nin"]

    // 待写入数据
    let dictionary:NSDictionary = ["name":"chen chao", "age":"18", "info":"Good Teacher"]

    // 写 Plist 文件

        // 数组写入 plist 文件
        let bl1:Bool = array.writeToFile(arrayPath, atomically: true)

        // 字典写入 plist 文件
        let bl2:Bool = dictionary.writeToFile(dictionaryPath, atomically:true)

    // 读 Plist 文件

        let arrayFromPlist:NSArray? = NSArray(contentsOfFile: arrayPath)
        let dicFromPList:NSDictionary? = NSDictionary(contentsOfFile: dictionaryPath)

3、Plist 序列化

    let arrayPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/arrayPropertyList.plist")
    let dictionaryPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/dictionaryPropertyList.plist")

    // 待写入数据
    let array:NSArray = ["bei", "jing", "huan", "ying", "nin"]

    // 待写入数据
    let dictionary:NSDictionary = ["name":"chen chao", "age":"18", "info":"Good Teacher"]

    // 序列化,将数据转换成 XML 格式的文件

        let arrayData:NSData = try! NSPropertyListSerialization.dataWithPropertyList(array,
                                                                              format: .XMLFormat_v1_0,
                                                                             options: 0)

        let dictionaryData:NSData = try! NSPropertyListSerialization.dataWithPropertyList(dictionary,
                                                                                   format: .XMLFormat_v1_0,
                                                                                  options: 0)

        // 输出到 .txt 格式文件中
        let bl1:Bool = arrayData.writeToFile(arrayPath, atomically: true)
        let bl2:Bool = dictionaryData.writeToFile(dictionaryPath, atomically:true)

    // 反序列化

        let arrayFromeFile:NSArray = NSArray(contentsOfFile: arrayPath)!
        let dicitionaryFromeFile:NSDictionary = NSDictionary(contentsOfFile: dictionaryPath)!

4、Plist 文件的使用

4.1 Plist 文件的创建

4.2 Plist 文件的解析

    // 获得 Plist 文件的全路径
    let path = NSBundle.mainBundle.pathForResource(@"shops", ofType:@"plist")

    // 加载 plist 文件
    let shops:NSArray? = NSArray(contentsOfFile: path)

4.3 Plist 文件的解析过程

4.4 Plist 的使用注意

  • plist 的文件名不能叫做 “info”、“Info” 之类的。
  • 添加 plist 等文件资源的时候,一定要勾选下面的选项。

时间: 2024-10-23 19:08:16

iOS - Swift PList 数据存储的相关文章

iOS - Swift NSUserDefaults 数据存储

前言 public class NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefaults 里存了一个可变数组,取出来的时候这个数组对象就变成了不可变的. NSUserDefaults 可以存储的数据类型包括:NSData.NSString.NSNumber.NSDate.NSArray.NSDictionary.如果要存储其他类型,则需要转换为前面的类型,才能用 NSUserDefa

iOS - OC PList 数据存储

前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如果要变动数据,直接修改数据文件即可,不用修改代码.一般可以使用属性列表文件存储 NSArray 或者 NSDictionary 之类的数据,这种 "属性列表文件" 的扩展名是 plist,因此也称为 "plist 文件". plist 是以 xml 文件形式存储的. 如

iOS开发之数据存储之NSKeyedArchiver

1.概述 NSKeyedArchiver归档和plist文件存储不同的是NSKeyedArchiver可以直接保存对象.如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复.不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以被存储. NSCoding协议中的2个方法: (1)encodeWithCoder: 存对象时该方法必须实现,每次归档对象时,都会

iOS - OC NSUserDefaults 数据存储

前言 @interface NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefaults 里存了一个可变数组,取出来的时候这个数组对象就变成了不可变的. NSUserDefaults 可以存储的数据类型包括:NSData.NSString.NSNumber.NSDate.NSArray.NSDictionary.如果要存储其他类型,则需要转换为前面的类型,才能用 NSUserDefaul

iOS开发之数据存储之XML属性列表(plist)归档

1.概述 "归档"意思是持久化存储数据.plist文件是一种XML格式的文件,拓展名为plist.如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件(plist文件)中.特别注意的是plist文件不能存储对象. IOS常用文件存储方式有: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(N

iOS开发之数据存储之SQLite3(包括FMDB)

1.概述 SQLite3是一款开源的嵌入式关系型数据库,可移植性好.易使用.内存开销小. SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中.比如下列的创表语句是合法的: create table t_person(name, age); 为了保证可读性,建议还是把字段类型加上: create table t_person(name text, age integer); SQLite将数据划分为以下几种存储类型: integer : 整型值 real : 浮点值 te

iOS - Swift SQLite 数据库存储

前言 采用 SQLite 数据库来存储数据.SQLite 作为一中小型数据库,应用 iOS 中,跟前三种保存方式相比,相对比较复杂一些. 注意:写入数据库,字符串可以采用 char 方式,而从数据库中取出 char 类型,当 char 类型有表示中文字符时,会出现乱码.这是因为数据库默认使用 ASCII 编码方式.所以要想正确从数据库中取出中文,需要用 NSString 来接收从数据库取出的字符串. sqlite 的方法: sqlite3 *db 数据库句柄,跟文件句柄很类似 sqlite3_s

iOS - Swift NSKeyedArchiver 数据归档

前言 public class NSKeyedArchiver : NSCoder public class NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象.通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象.可以使用归档的方法进行对象的深复制. 采用归档的形式来保存数据,该数据对象需要遵守 NSCoding 协议,并且该对象对应的类必须提供 encodeWithCoder: 和 ini

iOS开发之数据存储之NSData

1.概述 使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中,但有时候可能想将多个对象写入到同一个文件中,那么就要使用NSData来进行归档对象. NSData可以为一些数据提供临时存储空间,以便随后写入文件,或者存放从磁盘读取的文件内容.可以使用[NSMutableData data]创建可变数据空间. 2.归档2个Person对象到同一文件中 归档(编码): // 新建一块可变数据区 NSMutableData *data = [NSMutableD