Swift - 文件目录路径获取及数据储存(Home目录,文档目录,缓存目录)
应用沙盒结构分析
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 . UserDomainMask , true ) let documnetPath = documentPaths[0] as ! String //方法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 . UserDomainMask , true ) let libraryPath = libraryPaths[0] as ! String //Library目录-方法2 let libraryPath2 = NSHomeDirectory () + "/Library" //Cache目录-方法1 let cachePaths = NSSearchPathForDirectoriesInDomains ( NSSearchPathDirectory . CachesDirectory , NSSearchPathDomainMask . UserDomainMask , true ) let cachePath = cachePaths[0] as ! String //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 ) } |
Swift - 文件目录路径获取及数据储存(Home目录,文档目录,缓存目录)的更多相关文章
- iOS开发——数据持久化Swift篇&文件目录路径获取(Home目录,文档目录,缓存目录等)
文件目录路径获取(Home目录,文档目录,缓存目录等) iOS应用程序只能在自己的目录下进行文件的操作,不可以访问其他的存储空间,此区域被称为沙盒.下面介绍常用的程序文件夹目录: 1,Home ...
- Swift - 常用文件目录路径获取(Home目录,文档目录,缓存目录等)
当前位置: 首页 > 编程社区 > Swift > Swift - 常用文件目录路径获取(Home目录,文档目录,缓存目录等) Swift - 常用文件目录路径获取(Home目录,文 ...
- sqlserver将数据库的数据导成excel文档方法
sqlserver将数据库的数据导成excel文档方法 最近公司需要下载uniport的数据跟之前的数据进行对比,所以避免不了需要将数据库的数据导出来,把SQLServer表中的数据导出为Excel文 ...
- C# 如何获取某用户的“我的文档”的目录
Console.WriteLine(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)); System.E ...
- [Xcode 实际操作]七、文件与数据-(17)解析JSON文档
目录:[Swift]Xcode实际操作 本文将演示如何解析JSON文档. 项目中已添加一份JSON文档:menu.json { "menu": { "id": ...
- ASP.NET 动态查找数据 并且生成xml文档 同时使用xslt转换为xhtml
前言 xsl是一门标签解析语言,很适合做动态网页的前台标签 www.bamn.cn 1 首先是aspx页面 添加一个输入框 按钮 还有一个用来显示解析后的xhtml代码的控件 <form id= ...
- JavaScript -获取屏窗与视窗、文档宽高
实例:1920*1080的电脑屏幕 1.获取窗口中的文档显示区域宽高 clientw = window.innerWidth; //1920(包含滚动条) clienth = window.inner ...
- [Xcode 实际操作]七、文件与数据-(16)解析XML文档
目录:[Swift]Xcode实际操作 本文将演示如何解析XML文档. 项目中已添加一份XML文档:worker.xml <?xml version="1.0" encodi ...
- 告别收费BI!如何自己动手做一个免费的可视化数据报表还支持文档在线预览?
本人大学刚毕业目前在一家互联网公司从事产品运营工作,一季度刚过,公司需要我出一份产品运营数据报表,由于产品用户数据.订单数据等数据量太大,我希望找一款Bi产品,支持我做出一个精美的可视化报表,还可以让 ...
随机推荐
- Keepalived高可用集群介绍
1.Keepalived服务介绍 Keepalived起初是专为LVS设计的,专门用来监控LVS集群系统中各个服务节点的状态,后来又加入了VRRP的功能,因此除了配合LVS服务外,也可以为其他服务(n ...
- Redis学习笔记八:独立功能之二进制位数组
Redis 提供了 setbit.getbit.bitcount.bitop 四个命令用于处理二进制位数组. setbit 命令用于为位数组指定偏移量上的二进制位设置值,偏移量从 0 开始计数. ge ...
- 用phpcms开发模块时中文乱码问题
学着用phpcms开发一个文件管理模块,出现中文乱码,折腾了半天,总结如下 1.自己在mysql客户端建表,默认表格的编码为latin1_swedish_ci,虽然可以建好后用alter命令修改编码, ...
- [POJ3096]Surprising Strings
[POJ3096]Surprising Strings 试题描述 The D-pairs of a string of letters are the ordered pairs of letters ...
- [POJ1068]Parencodings
[POJ1068]Parencodings 试题描述 Let S = s1 s2...s2n be a well-formed string of parentheses. S can be enco ...
- Java 反射的应用
在学习反射之前,让我们先了解“类(Class)”.“方法”.“属性”.“类”都是名词,那么相应的在Java中会有这样一些特殊的类:“方法类(Method类)”.“属性类(Field类)”.“构造器类( ...
- iOS 简单音乐播放器 界面搭建
如图搭建一个音乐播放器界面,具备以下几个简单功能: 1,界面协调,整洁. 2,点击播放,控制进度条. 3.三收藏歌曲,点击收藏,心形收藏标志颜色加深. 4,左右按钮,切换歌曲图片和标题. 5,点击中间 ...
- 用int类型表示最大公倍数
代码 #include<stdio.h> #include<stdlib.h> #include<limits.h> int main(void) { int m, ...
- JavaScript之函数
控制语句(switch) switch(name){ case '1': age = 123; break; case '2': age = 456; break; case '3': age = 7 ...
- python日志浅析
输出日志对于追踪问题比较重要. 默认logger(root) python使用logging模块来处理日志.通常下面的用法就能满足常规需求: import logging logging.debug( ...