Swift之沙盒与数据存储

作者: GoGooGooo | 来源:发表于2016-01-05 23:32 被阅读7007次
    应用沙盒结构分析
    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

    相关文章

      网友评论

      本文标题:Swift之沙盒与数据存储

      本文链接:https://www.haomeiwen.com/subject/eegzhttx.html