前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不胜感激.
什么叫数据持久化:

在这里我就不照搬教科书上抽象的概念了.我觉得既然要把东西写出来就让它简单明了.

要搞清楚数据持久化,首先要知道数据持久化是相对于缓存而言的,缓存是在程序运行的过程中保存在内存中,程序一旦运行结束,其内存就会被释放.缓存在内存中的数据也就随之消失.

那么数据持久化就是要解决上述的这个问题,如常见的用处:保存用户设置的头像,昵称等这些重要信息.

解决的思路如下:将程序运行过程中需要保存的数据通过一定的形式(某些载体)保存起来而不是简单地在程序运行过程中缓存起来.此操作之后,在程序下次运行的时候可以再将这些数据从存储的载体中读取出来,那么我们也就实现了数据持久化

(保存的操作叫做序列化,读取解析操作叫反序列化)

简言之就是:将数据通过一定的形式保存起来并在需要时再读取解析就实现了所谓的数据持久化

数据存储大致分为两大方式

1.文件存储

将需要的数据通过文件存储起来如:bin文件xml文件txt文件等等..

2.数据库存储

将数据保存到数据库相应的表字段中, 常见的数据库有SQLServer MySQL Oracle 以及SQLite

 
下面将介绍IOS开发中的文件存储形式,其他内容将在以后博客中介绍
 
1.文件保存路径--应用沙盒

我们刚刚说到将数据保存到文件中,那么有文件就有文件保存的路径.

在IOS中,我们的应用将打包其文件到特定的文件夹(目录)中,这种个文件夹 叫做应用沙盒,每个应用都有自己的应用沙盒,并且每个沙盒之间是相互独立的.这样做的原因,两个字:安全.相互独立,也就是说程序无法随意篡改或删除其他程序的文件,浏览器中保存cookie的文件也是如此,不同域名有不同的cookie文件,并且无法访问其他域名下相关的cookie的文件...扯远了,有兴趣的朋友自己扩展

2.初步了解沙盒的目录结构

1) 拿到我们应用沙盒的根路径: NSHomeDirectory()

2) 步骤截图:

步骤一:在viewDidLoad:如下图所示,右边显示便是沙盒路径(复制)

步骤二:打开Finder 并按下快捷键cmd+shift+G 输入沙盒路径 并回车

步骤三,得到沙盒结构图

3.应用沙盒结构作用说明

Document

特点:保存程序运行时生成的数据,并且会通过ICloud自动备份,若用户通过ITunes进行同步时默认也将备份该目录

Library/Caches

一般保存的是可以重新下载或重新生成的数据,一般是体积大非重要的数据

Library/Preferences

保存应用所以的偏好设置,如用户选择记住密码. 用户通过ITunes进行同步时默认将备份该目录

tmp

保存程序运行时产生的临时数据,使用完成将删除.注意删除以免浪费用户空间

所以我们根据在存储数据文件的时候需要结合上面所列的目录特点,将对应的数据保存至适当的路径下面

4.获取路径相关代码:(以Documents 为例)

两种方式:

1.拼接:

NSString homePath = NSHomeDirectory();//获取沙盒根路径

NSString documentPath =
[ homePath stringByAppendingPathComponent:@"Documents"];

2.搜索目录

NSArray*pathArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);

NSString documentPath = [pathArray objectAtIndexOf :0];

 
数据存储之属性列表

1).什么是属性列表:

属性列表本质上是XML格式的后缀名位plist的文件(空格键预览可以看到明显的xml结构)如图:

2).特点:

存储的数据量较小,默认情况下只适用于特定对象
如:NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NSNumber,NSDate

3).代码

存储(归档,以NSDictionary为例)
-(void)writeDictionaryToFile{
    //1.初始化对象
    NSDictionary *dic = @{
                                @"name":@"jack",
                                @"country":@"China",
                                @"province":@"GuangDong"
                                };

    //2.保存路径(Documents)
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,   NSUserDomainMask, YES) firstObject];
    path = [path stringByAppendingPathComponent:@"testdic.plist"];
    //3保存文件
    [dic writeToFile:path atomically:YES];
}

程序运行后我们找到创建好的文件,打开效果如图:

 

读取(解档)代码:

-(void)readDictionaryFromFile{
    //1.获取路径
    NSString *path =    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES) firstObject];
    path = [path stringByAppendingPathComponent:@"testdic.plist"];
    //2.读取文件中的数据
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:path];

    NSLog(@"%@",dic);
}

效果图(断点):

 
至此我们已经实现了数据的存储和读取,但是只限于系统默认支持的对象,现实开发中我们经常需要将自定义的对象进行归档.限于篇幅,下篇博客再续
 
 

IOS开发--数据持久化篇之文件存储(一)的更多相关文章

  1. IOS开发--数据持久化篇文件存储(二)

    前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...

  2. iOS开发——数据持久化Swift篇&通用文件存储

    通用文件存储 import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextFie ...

  3. iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储

    使用Core Data进行数据持久化存储   一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...

  4. iOS开发——数据持久化Swift篇&iCloud云存储

    iCloud云存储 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super. ...

  5. iOS开发——数据持久化&本地数据的存储(使用NSCoder将对象保存到.plist文件)

    本地数据的存储(使用NSCoder将对象保存到.plist文件)   下面通过一个例子将联系人数据保存到沙盒的“documents”目录中.(联系人是一个数组集合,内部为自定义对象).   功能如下: ...

  6. iOS开发——数据持久化OC篇&plist文件增删改查操作

    Plist文件增删查改   主要操作: 1.//获得plist路径    -(NSString*)getPlistPath: 2.//判断沙盒中名为plistname的文件是否存在    -(BOOL ...

  7. iOS开发——数据持久化Swift篇&(二)沙盒文件

    沙盒文件 //******************** 5.2 文件操作 func use_FileOperations() { //1.获取程序的Home目录 let homeDirectory = ...

  8. iOS开发——数据持久化Swift篇&(三)SQLite3

    SQLite3 使用 //******************** 5.3 SQLite3存储和读取数据 func use_SQLite3() { //声明一个Documents下的路径 var db ...

  9. iOS开发——数据持久化Swift篇&(一)NSUserDefault

    NSUserDefault //******************** 5.1 NSUserDefault和对象归档 func useNSUserDefault() { //通过单利来创建一个NSU ...

随机推荐

  1. TouchDevelop [Mobile App]

    TouchDevelop是一个全新的Windows Phone软件开发环境,是第一个可以使用手机编程的应用. 所用语言看上去有点像BASIC,也有Scratch和AppInventor那样的色块拖拽环 ...

  2. win10 google浏览器设置

    在浏览器地址栏中输入命令: chrome://flags/ 撤销:chrome设置了禁止此页弹出提示框 chrome://settings/contentExceptions#popups

  3. 简单理解ECMAScript2015中的Promise

    ECMAScript6中新增了Promise对象, 所谓Promise对象,即代表着一个还未完成,但将来某时会完成的操作(通常是异步操作).使用Promise对象,我们就可以避免陷入函数层层嵌套的‘回 ...

  4. sasscore学习之_mixin.scss

    _mixin scss包括常用的mixin,%及@functionmixin,通过@include调用,样式通过拷贝的方式使用,尤其适用于传递参数%,通过@extend调用,样式通过组合申明的方式使用 ...

  5. SQL Network Interfaces, error: 50 - 发生了 Local Database Runtime 错误。无法创建自动实例。

    今天在用VS2013自带的LocalDB调整数据库时出错,在网上也搜到许多方案,如卸载SQLServer LocalDB的程序.重新创建实例等都没有解决我的问题,也重新修改以及修复Vs,问题依旧存在, ...

  6. 10)Java Error and Exception

      1>异常继承类        Error类和Exception类都继续自Throwable类      Error表示系统级的错误情况,如内存错误这样程序无法通过自身的处理再继续执行下去的情 ...

  7. YOUYOU深入学习Ganglia之三(gmetad的软件架构)

    Ganglia这个东西,目前的情况是测试的多,真正在数据中心部署过的人少:使用的多,真正能了解其代码架构的人少.这里根据我的经验,分解一下ganglia的gmetad的软件架构,欢迎大家交流. 上面的 ...

  8. Windows Azure功能更新:SQL Server AlwaysOn和Notification Hub 正式商用

    一周以前Windows Azure发布了新的更新内容,主要的更新有3项: 虚拟机上的SQL Server支持AlwaysOn可用性组了 Notification Hub商用 自动缩放支持时间策略 这里 ...

  9. 如何禁止KEIL初始化RAM为零& 如何判断是软复位还是上电复位

    (1)如何禁止KEIL初始化RAM为零? 1. 在KEIL Noinit 打钩 2. <1> 另须对需要热启动保持的变量用 _at_ 关键字指定某个区域,否则还是没用 <2>或 ...

  10. 微信中web页面实现和公众号中查看图片一样的效果

    最近开发了一套资讯相关的web页面,嵌套在微信中,可支持点赞.评论等...在文章详情中,图片需要点击放大,随手势放大缩小,左右可滑动切换,总之类似于微信公众号效果. 开始想的方案是用轮播插件.或者在i ...