iOS数据存储之属性列表理解

数据存储简介

数据存储,即数据持久化,是指以何种方式保存应用程序的数据。
我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起驻留在内存中,一旦程序运行结束从内存中退出后,这些数据也就相应消失了。等到再次运行程序的时候,之前的那些数据又要重新计算。但是对于一些应用,我们需要将程序产生的数据持久的保存起来,使得应用重启之后这些数据不会丢失,这时候就需要用到数据的持久化技术。
在iOS设备上实现数据持久化存储的方式有很多中机制,较为常见的有以下4种:

  1. 属性列表

  2. 对象归档

  3. iOS的嵌入式关系数据库(SQLite)

  4. 苹果公司提供的持久化工具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数据存储之属性列表理解的更多相关文章

  1. 数据存储之属性列表Plist

    常用的数据存储有属性列表.偏好设置.归档.sqlite.coreData.上一博客了解了沙盒,现在了解下属性列表Plist. 通常通过NSArray.NSDictionary集合类的WriteToFi ...

  2. iOS数据存储之对象归档

    iOS数据存储之对象归档 对象归档 对象归档是iOS中数据持久化的一种方式. 归档是指另一种形式的序列化,但它是任何对象都可以实现的更常规的类型.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文 ...

  3. iphone开发中数据持久化之——属性列表序列化(一)

    数据持久化是应用程序开发过程中的一个基本问题,对应用程序中的数据进行持久化存储,有多重不同的形式.本系列文章将介绍在iphone开发过程中数据持久化的三种主要形式,分别是属性列表序列号.对象归档化以及 ...

  4. iOS数据存储类型 及 堆(heap)和栈(stack)

    iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 --  由编译器自动分配释放. 2堆 --  一般由程序员分配释放,若程序员不释放,程序结束时可能由O ...

  5. iOS数据持久化存储之属性列表

    属性列表(plist) iOS提供了一种plist格式的文件(属性列表)用于存储轻量级的数据,属性列表是一种XML格式的文件,拓展名为plist.如果对象是NSString.NSDictionary. ...

  6. HTML5 Canvas 数据持久化存储之属性列表

    属性列表想必大家都不会陌生,正常用 HTML5 来做的属性列表大概就是用下拉菜单之类的,而且很多情况下,下拉列表还不够好看,怎么办?我试着用 HT for Web 来实现属性栏点击按钮弹出多功能选框, ...

  7. iOS开发备忘录:属性列表文件数据持久化

    属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfFile:类 ...

  8. iOS数据存储

    [reference]http://www.infoq.com/cn/articles/data-storage-in-ios 谈到数据储存,首先要明确区分两个概念,数据结构和储存方式.所谓数据结构就 ...

  9. 最全的iOS数据存储方法

    目的 项目准备运用的Core Data进行本地数据存储,本来打算只写一下Core Data的,不过既然说到了数据存储,干脆来个数据存储基础大总结!本文将对以下几个模块进行叙述. 沙盒 Plist Pr ...

随机推荐

  1. Sina App Engine(SAE)入门教程(10)- Cron(定时任务)使用

    参考资料 SAE Cron说明文档 Cron能干什么? cron 可以定时的触发一个脚本,在sae上最大的频率是一分钟一次.你可以用其来完成自己需要的业务逻辑,例如定期的抓取某些网页完菜信息的采集,定 ...

  2. JavaWeb项目开发案例精粹-第3章在线考试系统-004Service层

    1. package com.sanqing.service; import java.util.List; import com.sanqing.po.Student; public interfa ...

  3. eclipse 中忽略jsp, xml文件中的报错信息

    有的时候, 在eclipse中, jsp, xml 文件时运行的好好的, 可是就是在eclipse中报错, 虽然不影响功能, 但看起来很烦, 去掉这些错误警告的方法是: Windows-Prefere ...

  4. C++:纯虚函数与抽象类

    5.4.3 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但是要求在派生类中根据需要对它进行定义,或仍然说明为纯虚函数. 声明纯虚函数的一般格式是: virtual 函数 ...

  5. Android ListView高度自适应和ScrollView冲突解决

    在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查,S ...

  6. Android ActionBar的Overlay模式如何不遮盖顶部内容的问题

    关于actionbar的overlay模式请参考 如何让android的actionbar浮动且透明 一文.这篇文章讲的是如何在这种模式下让actionbar不遮住顶部的内容. 这 一般是这样的场景, ...

  7. Right Column - 右侧栏目

    function share(sType){ var sName = "Yorhom\'s Game Box"; var title='Yorhom\'s Game Box', _ ...

  8. 使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务

    使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务 作者:Nikolay Manchev 分步构建一个跨这些平台的 ...

  9. IntelliJ IDEA For Mac 快捷键——常用版

    一.搜索 搜索文件  command+shift+n 打开方法实现类  command+option+b 全文搜索 ctrl+shift+f (1)类和方法 查看类的继承结构 ctrl+h 查看方法的 ...

  10. codeforces 235 div2 C Team

    题目:http://codeforces.com/contest/401/problem/C 题意:n个0,m个1,求没有00或111的情况. 这么简单的题..... 做题的时候脑残了...,今天,贴 ...