返回 导航

Swift

hangge.com

Swift - .plist文件数据的读取和存储

作者:hangge | 2015-09-28 09:37
(本文代码已升级到Swift4)

每次在Xcode中新建一个iOS项目后,都会自己产生一个.plist文件,里面记录项目的一些配置信息。我们也可以自己创建.plist文件来进行数据的存储和读取。
 
.plist文件其实就是一个XML格式的文件,其支持的数据类型有(NS省略)Dictionary、Array、Boolean、Data、Date、Number、String这些类型。
当然对于用户自定义的对象,通过NSCoder转换后也是可以进行存储的。(常见我的另一篇文章“Swift - 本地数据的保存与加载(使用NSCoder将对象保存到.plist文件)”)

本文主要介绍如何使用.plist文件进行数组,字典,字符串等这些基本数据类型的存储和读取。
由于不需要转化,所以用起来还是很方便的。而且在大多数情况下,使用基本数据类型就足够了。

1,数组(Array)的存储和读取
(1)存储
下面把一个数组写入plist文件中(保存在用户文档目录),数组内是各个网站的地址。
let array = NSArray(objects: "hangge.com","baidu.com","google.com","163.com","qq.com")
let filePath:String = NSHomeDirectory() + "/Documents/webs.plist"
array.write(toFile: filePath, atomically: true)
进入目录打开webs.plist,可以看到生成的数据如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
	<string>hangge.com</string>
	<string>baidu.com</string>
	<string>google.com</string>
	<string>163.com</string>
	<string>qq.com</string>
</array>
</plist>

(2)读取
下面把webs.plist文件中数据读取出来显示在表格里
import UIKit

class ViewController: UIViewController , UITableViewDelegate, UITableViewDataSource{
    
    
    @IBOutlet weak var tableView: UITableView!
    
    var webs:NSArray?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        webs = NSArray(contentsOfFile: NSHomeDirectory() + "/Documents/webs.plist")
        self.tableView!.delegate = self
        self.tableView!.dataSource = self
        //创建一个重用的单元格
        self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "cell0")
    }
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return webs!.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
        -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell0",
                                                 for: indexPath) as UITableViewCell
            let url = webs![indexPath.row] as! String
            cell.textLabel?.text = url
            return cell
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

2,字典(Dictionary)的存储和读取 
下面给每条网址都附上网站名,这时我们就要使用字典了。
(1)存储
除了每条网站记录使用字典类型,外面还拆分成两个数组分别存储,用于下面表格的分区展示。
let myArray = [
    [
        ["name":"航歌", "url":"hangge.com"],
        ["name":"百度", "url":"baidu.com"],
        ["name":"google", "url":"google.com"]
    ],
    [
        ["name":"163", "url":"163.com"],
        ["name":"QQ", "url":"qq.com"]
    ]
]  //声明一个字典

let filePath:String = NSHomeDirectory() + "/Documents/webs.plist"
NSArray(array: myArray).write(toFile: filePath, atomically: true)
print(filePath)
进入目录打开webs.plist,可以看到生成的数据如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
	<array>
		<dict>
			<key>name</key>
			<string>航歌</string>
			<key>url</key>
			<string>hangge.com</string>
		</dict>
		<dict>
			<key>name</key>
			<string>百度</string>
			<key>url</key>
			<string>baidu.com</string>
		</dict>
		<dict>
			<key>name</key>
			<string>google</string>
			<key>url</key>
			<string>google.com</string>
		</dict>
	</array>
	<array>
		<dict>
			<key>name</key>
			<string>163</string>
			<key>url</key>
			<string>163.com</string>
		</dict>
		<dict>
			<key>name</key>
			<string>QQ</string>
			<key>url</key>
			<string>qq.com</string>
		</dict>
	</array>
</array>
</plist>
(2)读取
下面把webs.plist文件中数据读取出来,并在表格里分区显示
import UIKit

class ViewController: UIViewController , UITableViewDelegate, UITableViewDataSource{
    
    @IBOutlet weak var tableView: UITableView!
    
    var webs:NSArray?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        webs = NSArray(contentsOfFile: NSHomeDirectory() + "/Documents/webs.plist")
        self.tableView!.delegate = self
        self.tableView!.dataSource = self
        //创建一个重用的单元格
        self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "cell0")
        
    }
    
    // UITableViewDataSource协议中的方法,该方法的返回值决定指定分区的头部
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return " ";
    }
    
    //在本例中,有2个分区
    func numberOfSections(in tableView: UITableView) -> Int {
        return webs!.count;
    }
    
    //每个分区的记录数
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let data = self.webs?[section] as! Array<AnyObject>
        return data.count
    }
    
    //每个单元格创建和内容赋值
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
        -> UITableViewCell {
            let cell = UITableViewCell(style: .value1, reuseIdentifier: "cell0")
            let data = self.webs?[indexPath.section] as! Array<AnyObject>
            let url = data[indexPath.row]["url"] as! String
            let name = data[indexPath.row]["name"] as! String
            cell.textLabel?.text = name
            cell.detailTextLabel?.text = url
            return cell
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
评论

全部评论(11)

回到顶部