Swift之沙盒与数据存储

应用沙盒结构分析

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!)
}

你可能感兴趣的:(Swift之沙盒与数据存储)