zoukankan      html  css  js  c++  java
  • 第七课——iOS数据持久化

    今天我们要学习plist、Preference、NSKeyedArchiver、Sqlite、CoreData(属性列表、偏好设置、归档、数据库、模型化对象)。

    首先plist就是将某些特定类,通过XML文件保存在目录中。程序都有自己的沙盒:主要会涉及到的文件夹有XXX.app(应用程序包)、Documents、Library/Caches、Library/Preferences、tmp。每个文件夹各自特性不同。

    XXX.app存放程序所有的源文件,包括了资源文件(nib文件、其他资源)、可执行文件,虽然它在Finder中看起来就是一个普通文件,但实际上它是一个目录,它是程序的main bundle,所以可以通过Bundle类显示:print(Bundle.main.bundlepath)。

    Documents用于存放重要数据,所以需要同步此文件夹的内容,一般就是数据库文件。通过FileManager显示(需要解包!):print(FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!)

    Library/Caches用于存放体积大、不需要备份的非重要数据。通过FileManager显示(需要解包!):print(FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!)

    Library/Preferences用于存放程序的信息设置文件(一般不要存放其它类型的文件),所以同步时应该更新此文件夹的内容。

    tmp存放一些临时文件,用完就删除。

    对plist文件的操作:

       let file = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first

            //自定义该文件

            let fileName = file?.appendingPathComponent("test.plist")

            let array = NSArray(objects: "131", "231", "312", "")

            try! array.write(toFile: (fileName?.path)!, atomically: true)

            //读取该文件

            let result = NSArray(contentsOfFile: (fileName?.path)!)

            

            print((fileName?.path)!)

            print(result!)

    此外,保存偏好设置(之前的Preference)和读取偏好设置:

        let userDefaults = UserDefaults.standard

            userDefaults.set("AAA", forKey: "str")

            userDefaults.set(true, forKey: "sex")

            userDefaults.set(21, forKey: "ages")

            userDefaults.synchronize()  //如果不同步,第二次及以后对文件的修改就不会被更新写入到文件

            print(userDefaults.object(forKey: "str")!)

            print(userDefaults.object(forKey: "sex")!)

            print(userDefaults.object(forKey: "age")!)

    Sqlite完整代码:

    import UIKit

    class ViewController: UIViewController {

        var db: SQLiteDB!

        

        @IBOutlet weak var no: UITextField!

        @IBOutlet weak var name: UITextField!

        override func viewDidLoad() {

            super.viewDidLoad()

            db = SQLiteDB.sharedInstance

            print(NSHomeDirectory())    //数据库保存位置:OC方式

       //swift方式

        let fileManager = FileManager.default

            let path = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first

            print(path)

        }

        @IBAction func Start(_ sender: UIButton) {

            _ = db.execute(sql: "create table admin(no TEXT not null primary key, name TEXT)")

        }

        

        @IBAction func Add(_ sender: UIButton) {

            _ = db.execute(sql: "insert into admin values('1','shutao')")

        }

        @IBAction func Login(_ sender: UIButton) {

            let data = db.query(sql: "select * from admin")

            if data.count > 0 {

                let user = data[data.count - 1]

                no.text = user["no"] as? String

                name.text = user["name"] as? String

            }

        else {

                let alertController = UIAlertController(title: "数据表为空", message: "请先添加学生,再查询", preferredStyle: .alert)

                let cancelAction = UIAlertAction(title: "返回", style: .cancel, handler: nil)

                alertController.addAction(cancelAction)

                self.present(alertController, animated: true, completion: nil)

            }

        }

    最新版本(可直接处理文本输入:将文本!):http://files.cnblogs.com/files/quanxi/das.zip

  • 相关阅读:
    Android基站定位
    删除远程分支
    docker的相关使用
    [整理]-端口的概念、常用端口及其对应服务
    [转]-nohup-真正的Shell后台运行
    转- 在ubuntu下安装Nginx
    转: 命名关键字参数
    远程SCP报错,报22号口错误
    vim保存时提示: 无法打开并写入文件
    如何处理导出的csv无法查看身份证后三位的情况?
  • 原文地址:https://www.cnblogs.com/quanxi/p/6119875.html
Copyright © 2011-2022 走看看