zoukankan      html  css  js  c++  java
  • Swift

    iOS应用程序只能在自己的目录下进行文件的操作,不可以访问其他的存储空间,此区域被称为沙盒。
     
    应用沙盒结构分析
    1、应用程序包:包含了所有的资源文件和可执行文件
    
    2、Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录
    
    3、tmp:保存应用运行时所需要的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行,系统也可能会清除该目录下的文件,iTunes不会同步备份该目录
    
    4、Library/Cache:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不备份该目录。一般存放体积大、不需要备份的非重要数据
    
    5、Library/Preference:保存应用的所有偏好设置,IOS的Settings应用会在该目录中查找应用的设置信息。iTunes

    IOS中的数据存储
    /**
    NSSearchPathDirectory.DocumentDirectory 查找Documents文件夹
    NSSearchPathDomainMask.UserDomainMask 在用户的应用程序下查找
    true 展开路径   false 当前应用的根路径 == “~”
    */
    let docPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as NSString
    
    // 上面代码代替下面代码,防止Documen文件夹不存在*****************************************************************
    
    // 获得沙盒的根路径
    let home = NSHomeDirectory() as NSString
    // 获得Documents路径,使用NSString对象的stringByAppendingPathComponent()方法拼接路径
    let docPath = home.stringByAppendingPathComponent("Documents") as NSString

    1、存储为plist属性列表

    func saveWithFile() {
        // 1、获得沙盒的根路径
        let home = NSHomeDirectory() as NSString
        // 2、获得Documents路径,使用NSString对象的stringByAppendingPathComponent()方法拼接路径
        let docPath = home.stringByAppendingPathComponent("Documents") as NSString
        // 3、获取文本文件路径
        let filePath = docPath.stringByAppendingPathComponent("data.plist")
        let dataSource = NSMutableArray()
        dataSource.addObject("小桥上我曾背你走过")
        dataSource.addObject("河边上为你放的烟火")
        dataSource.addObject("电影院最后一排座我们第一次吻过")
        dataSource.addObject("那么多浪漫我都记得")
        dataSource.addObject("别再跟着我漂泊")
        // 4、将数据写入文件中
        dataSource.writeToFile(filePath, atomically: true)
    }
    func readWithFile() {
        /// 1、获得沙盒的根路径
        let home = NSHomeDirectory() as NSString
        /// 2、获得Documents路径,使用NSString对象的stringByAppendingPathComponent()方法拼接路径
        let docPath = home.stringByAppendingPathComponent("Documents") as NSString
        /// 3、获取文本文件路径
        let filePath = docPath.stringByAppendingPathComponent("data.plist")
        let dataSource = NSArray(contentsOfFile: filePath)
        print(dataSource)
    }

    2、使用NSUserDefaults存储数据

    func saveWithNSUserDefaults() {  
        // 1、利用NSUserDefaults存储数据  
        let defaults = NSUserDefaults.standardUserDefaults()
        // 2、存储数据  
        defaults.setObject("衣带渐宽终不悔", forKey: "name")
        // 3、同步数据  
        defaults.synchronize()
    }
    func readWithNSUserDefaults(){
        let defaults = NSUserDefaults.standardUserDefaults()
        let name = defaults.stringForKey("name")
        let switch = defaults.boolForKey("bool")
        print(name)
        print(switch)
    }

    3、归档存储:对象需要实现NSCoding协议,归档对应encode,反归档对应decode

    /**
     归档数据
     需要实现NSCoding协议
     */
    func saveWithNSKeyedArchiver() {
        let docPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as NSString
        let filePath = docPath.stringByAppendingPathComponent("contact.data")
        let contact = Contact(name: "123333", phone: "123456")
        /**
        *  数据归档处理
        */
        NSKeyedArchiver.archiveRootObject(contact, toFile: filePath)
    }
    // 如果上面直接运行会报错,因为你需要在要归档的对象中遵循NSCoding协议,并实现归档方法和解析方法 如:
    class Contact: NSObject, NSCoding {
    
        var name: String?
        var phone: String?
    
        required init(name: String, phone: String){
            self.name = name
            self.phone = phone
        }
    
        // 在对象归档的时候调用(哪些属性需要归档,怎么归档)
        func encodeWithCoder(aCoder: NSCoder) {
            aCoder.encodeObject(name, forKey: "name")
        }
    
        // 解析NIB/XIB的时候会调用
        required init?(coder aDecoder: NSCoder) {
            super.init()
            name = aDecoder.decodeObjectForKey("name") as? String
        }
    }
    /**
     反归档数据
     */
    func readWithNSKeyedUnarchiver() {
        let docPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as NSString
        let filePath = docPath.stringByAppendingPathComponent("contact.data")
        let contact = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! Contact
        print(contact.name!)
    }

    4、SQlite3

    5、CoreData

     
    下面介绍常用的程序文件夹目录:
     
    1,Home目录  ./
    整个应用程序各文档所在的目录
    1
    2
    //获取程序的Home目录
    let homeDirectory = NSHomeDirectory()
     
    2,Documnets目录  ./Documents
    用户文档目录,苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
    1
    2
    3
    4
    5
    6
    7
    //方法1
    let documentPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,
        NSSearchPathDomainMask.UserDomainMasktrue)
    let documnetPath = documentPaths[0] asString
     
    //方法2
    let ducumentPath2 = NSHomeDirectory() + "/Documents"
     
    3,Library目录  ./Library
    这个目录下有两个子目录:Caches 和 Preferences
    Library/Preferences目录,包含应用程序的偏好设置文件。不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好。
    Library/Caches目录,主要存放缓存文件,iTunes不会备份此目录,此目录下文件不会再应用退出时删除
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //Library目录-方法1
    let libraryPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory,
        NSSearchPathDomainMask.UserDomainMasktrue)
    let libraryPath = libraryPaths[0] asString
     
    //Library目录-方法2
    let libraryPath2 = NSHomeDirectory() + "/Library"
     
     
    //Cache目录-方法1
    let cachePaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory,
        NSSearchPathDomainMask.UserDomainMasktrue)
    let cachePath = cachePaths[0] asString
     
    //Cache目录-方法2
    let cachePath2 = NSHomeDirectory() + "/Library/Caches"
     
    4,tmp目录  ./tmp
    用于存放临时文件,保存应用程序再次启动过程中不需要的信息,重启后清空。
    1
    2
    3
    4
    5
    //方法1
    let tmpDir = NSTemporaryDirectory()
     
    //方法2
    let tmpDir2 = NSHomeDirectory() + "/tmp"
    5,程序打包安装的目录 NSBundle.mainBundle()
    工程打包安装后会在NSBundle.mainBundle()路径下,该路径是只读的,不允许修改。
    所以当我们工程中有一个SQLite数据库要使用,在程序启动时,我们可以把该路径下的数据库拷贝一份到Documents路径下,以后整个工程都将操作Documents路径下的数据库。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //声明一个Documents下的路径
    var dbPath = NSHomeDirectory() + "/Documents/hanggeDB.sqlite"
    //判断数据库文件是否存在
    if !NSFileManager.defaultManager().fileExistsAtPath(dbPath){
        //获取安装包内数据库路径
        var bundleDBPath:String? = NSBundle.mainBundle().pathForResource("hanggeDB", ofType: "sqlite")
        //将安装包内数据库拷贝到Documents目录下
        NSFileManager.defaultManager().copyItemAtPath(bundleDBPath!, toPath: dbPath, error: nil)
    }
  • 相关阅读:
    防止表单重复提交的几种策略
    Linux模块
    ASP.Net MVC3 图片上传详解(form.js,bootstrap)
    在ASP.NET MVC3 中利用Jsonp跨域访问
    C# 利用反射动态创建对象——带参数的构造函数和String类型
    第一章 CLR 的执行模型
    Linux Shell脚本攻略 读书笔记
    使用MVC4,Ninject,EF,Moq,构建一个真实的应用电子商务SportsStore
    验证码识别的一些总结及相关代码
    使用DateTime的ParseExact方法实现特殊日期时间的方法详解(转)
  • 原文地址:https://www.cnblogs.com/gongyuhonglou/p/6029340.html
Copyright © 2011-2022 走看看