iOS数据存储之属性列表理解
iOS数据存储之属性列表理解
数据存储简介
数据存储,即数据持久化,是指以何种方式保存应用程序的数据。
我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起驻留在内存中,一旦程序运行结束从内存中退出后,这些数据也就相应消失了。等到再次运行程序的时候,之前的那些数据又要重新计算。但是对于一些应用,我们需要将程序产生的数据持久的保存起来,使得应用重启之后这些数据不会丢失,这时候就需要用到数据的持久化技术。
在iOS设备上实现数据持久化存储的方式有很多中机制,较为常见的有以下4种:
属性列表
对象归档
iOS的嵌入式关系数据库(SQLite)
苹果公司提供的持久化工具Core Data
除此之外还有NSUserDefaults、Preference等
属性列表
首先从属性列表开始学习
属性列表提供了一个方便的方式来存储简单的结构化数据。只有序列化对象才能存储在属性列表中。序列化对象是指可以被转换为字节流以便于存储到文件中或通过网络进行传输的对象。虽然说任何对象都可被序列化,但只有某些对象才能被放置到某个集合类中(如NSDictionary或NSArray中)属性列表机制将对象的相关数据存储在后缀为.plist的文件中。程序重新加载时,将从.plist文件中读取数据。
沙盒
在介绍属性列表之前简要介绍一下iOS应用的沙盒机制。iOS应用程序只能在为该程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此。
查看应用目录
为了更加直观的理解属性列表机制,我们在MAC上创建一个工程,并生成相应的应用,在虚拟机中运行应用。由于沙盒机制的存在,我们无法直接查看应用在虚拟机上的文件目录。可以在MAC上安装Simpholers,以方便查看虚拟机中的文件目录,安装完毕之后,可以点击工程上方(下图中红色框住的)按钮,以查看应用在虚拟机中的目录

然后在弹出的下拉框中点击对应的应用名称

接下来就可以看到应用的目录结构,如下图

属性列表生成的.plist文件将放置在应用的Documents目录下
案例
应用属性如下:
@property (strong, nonatomic) IBOutletCollection(UITextField) NSArray *lineFields;
即我们为这个应用设置了一个文本框组作为其属性,
应用界面如下:

我们的目的是,运行该应用的时候,在文本框组中填入数据,一旦应用退到后台或直接从系统退出后,将文本框的内容写入到.plist文件中。下次再启动应用时,自动读取.plist文件中的内容,然后把记录的对应文本框中的内容复制给应用中的文本框
获取.plist要保存的路径,代码如下:
- (NSString *)dataFilePath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
}
这段代码主要做了以下事情:
(1)查找Documents目录;
(2)找到之后,在该目录下添加一个数据文件data.plist;
(3)保存数据文件data.plist的完整路径
从.plist文件中读取数据,代码如下:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *filePath = [self dataFilePath];
NSLog(@"%@",filePath);
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
for (int i = 0; i < 4; i++) {
UITextField *theField = self.lineFields[i];
theField.text = array[i];
}
}
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(applicationWillResignActive:)
name:UIApplicationWillResignActiveNotification
object:app];
}
在viewDidLoad方法中,做以下几件事情:
(1)检查数据文件是否存在,如果不存在,就不加载它,如果存在,就用该文件的内容实例化数组
(2)将数组中的对象复制到4个文本框
(3)从属性列表中加载数据后,得到了对应用实例的引用,用该引用订阅UIApplicationWillResignActiveNotification,也就是说,当前对象把自己设置为观察者,观察它自身的行为,如果它从前台退出了,就会收到UIApplicationWillResignActiveNotification通知,接着就执行applicationWillResignActive方法中的内容。最后一个参数app指的是发布这个通知的应用,可以看出通知发出者也是它自身
将数据写入.plist文件中,代码如下:
- (void)applicationWillResignActive:(NSNotification *)notification
{
NSString *filePath = [self dataFilePath];
NSArray *array = [self.lineFields valueForKey:@"text"];
[array writeToFile:filePath atomically:YES];
}
这个方法看起来很简单,但实际上也做了很多事情。首先通过lineFields数组中每个文本框的text方法构建一个字符串数组,然后将数据的内容写入一个属性列表文件。使用属性列表保存数据。
整个属性列表的流程就介绍完了,接下来运行程序,看看结果。
结果
首次进入,应用中的文本框是空白的,Documents文件夹下也没有文件
在每个文本框中输入一些内容,如下:

然后按shift+command+H,唤出虚拟机的主界面,这时,查看应用程序Documents文件夹,如下:

可以看到,Documents文件夹下已经生成了data.plist文件
我们可以打开该文件,查看其文件内容,如下图:

可以看到,该文件中的value的值就是我们在文本框中输入的值。我们还可以直接在这个文件上编辑,保存之后,应用重新加载时,就会直接从这个文件中读取数据,然后显示在应用中。
实际上,.plist的文件格式是xml的,用Notepad++打开data.plist文件看到的内容如下:

总结
通过对属性列表理论的理解和实际的操作,对属性列表的机制有了一定理解。实际上我觉得属性列表就是将对象的属性写入到文件中,其本质就是将数据存储在文件中。应用从前台退出时,将数据写入到属性列表文件中,应用重新运行时,又充属性列表文件中读取数据。需要注意的是,并不是任何属性都能够写入到属性列表中。如果对象包含了一个自定义的对象作为其属性,这个自定义的对象属性将无法进行序列化。可以被序列化的OC类有如下几种:
NSArray、NSMutableArry、NSDictionary、NSMutableDictionay、NSData、NSMutableData、NSString、NSMutableString、NSNumber、NSDate。
从data.plist文件的添加操作中,可以看到添加的属性种类如下:

我们大概可以理解为,属性列表中保存的数据是oc中内置的属性,这种数据持久化机制适合保存配置文件等数据内容不多的文件。
iOS数据存储之属性列表理解的更多相关文章
- 数据存储之属性列表Plist
常用的数据存储有属性列表.偏好设置.归档.sqlite.coreData.上一博客了解了沙盒,现在了解下属性列表Plist. 通常通过NSArray.NSDictionary集合类的WriteToFi ...
- iOS数据存储之对象归档
iOS数据存储之对象归档 对象归档 对象归档是iOS中数据持久化的一种方式. 归档是指另一种形式的序列化,但它是任何对象都可以实现的更常规的类型.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文 ...
- iphone开发中数据持久化之——属性列表序列化(一)
数据持久化是应用程序开发过程中的一个基本问题,对应用程序中的数据进行持久化存储,有多重不同的形式.本系列文章将介绍在iphone开发过程中数据持久化的三种主要形式,分别是属性列表序列号.对象归档化以及 ...
- iOS数据存储类型 及 堆(heap)和栈(stack)
iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 -- 由编译器自动分配释放. 2堆 -- 一般由程序员分配释放,若程序员不释放,程序结束时可能由O ...
- iOS数据持久化存储之属性列表
属性列表(plist) iOS提供了一种plist格式的文件(属性列表)用于存储轻量级的数据,属性列表是一种XML格式的文件,拓展名为plist.如果对象是NSString.NSDictionary. ...
- HTML5 Canvas 数据持久化存储之属性列表
属性列表想必大家都不会陌生,正常用 HTML5 来做的属性列表大概就是用下拉菜单之类的,而且很多情况下,下拉列表还不够好看,怎么办?我试着用 HT for Web 来实现属性栏点击按钮弹出多功能选框, ...
- iOS开发备忘录:属性列表文件数据持久化
属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfFile:类 ...
- iOS数据存储
[reference]http://www.infoq.com/cn/articles/data-storage-in-ios 谈到数据储存,首先要明确区分两个概念,数据结构和储存方式.所谓数据结构就 ...
- 最全的iOS数据存储方法
目的 项目准备运用的Core Data进行本地数据存储,本来打算只写一下Core Data的,不过既然说到了数据存储,干脆来个数据存储基础大总结!本文将对以下几个模块进行叙述. 沙盒 Plist Pr ...
随机推荐
- Spring多资源文件properties的配置
Spring简化了加载资源文件的配置,可以通过<context:property-placeholder去加载,这个元素的写法如下: <context:property-placehold ...
- Orcle数据库查询练习复习:四
一.题目 1.找出张三的最高分和最低分以及对应的课程名 select * from course c,mark m where c.cid=m.cid and sid =(select sid fro ...
- 88. Merge Sorted Array
题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume ...
- linux快速修改文件夹及文件下所有文件与文件夹权限
分两部分改属主和权限: 更改权限,递归方式 chmod -R 755 /var/www/html/test.com 更改属主,递归 chown -R apache:apache /var/www/ht ...
- Android给listview的item设定高度
在item的layout文件中,用android:layout_height设置item的高度.运行,高度设置无效. 解决办法: 给item设定minHeight,即可. -------------- ...
- nodejs搭配phantomjs highcharts后台生成图表
简单分享一下,后台使用nodejs结合highcharts.phantomjs生成报表图片的方法.这主要应用在日报邮件. 主要参考以下资料: http://www.highcharts.com/com ...
- linux用VSFTP搭建FTP服务器
一般在各种linux的发行版中,默认带有的ftp软件是vsftp,从各个linux发行版对vsftp的认可可以看出,vsftp应该是一款不错的ftp软件. sudo apt-get install v ...
- Java内部类总结 分类: 原理 2015-06-28 09:51 9人阅读 评论(0) 收藏
内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的. 内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问 ...
- Lunix中文乱码解决方案
sudo vi /var/lib/locales/supported.d/local#添加下面的中文字符集zh_CN.GBK GBKzh_CN.GB2312 GB2312zh_CN.GB18030 G ...
- UVa 12230 (期望) Crossing Rivers
题意: 从A到B两地相距D,之间有n段河,每段河有一条小船,船的位置以及方向随机分布,速度大小不变.每段河之间是陆地,而且在陆地上行走的速度为1.求从A到B的时间期望. 分析: 我们只要分析每段河的期 ...