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

在许多应用程序中都使用了属性列表,比如使用属性列表来指定应用程序的首选项,可以使用Xcode或Property List Editor来手动编辑它们,并且只要字典或数组仅包含特定的可序列化对象,就可以使用NSDictionary和NSArray实例写入属性列表以及从属性列表中来创建他们。尽管,可以让任何对象序列化,但是智能将某些对象放置到某个集合类中(如NSDictionary或NSArray),然后使用该集合类的writeToFille::atomically方法将他们存储到属性列表中。可以序列化的Objective-C对象有:NSArray、 NSMutableArray、NSDictionary、NSMultabableDictionary、NSData、NSMutableData、NSString、NSMutableString、NSNumber、NSDate等。

如果打算使用属性列表持久保存应用程序数据,则可以使用NSArray或NSDictionary容纳所需要持久保存的数据。假设存在NSArray或NSDictionary中的所有对象都是课序列化的对象,则可以通过对字典或数组实例调用writeToFile:atomically方法来编写属性列表。但是,属性列表方法的一个突出问题就是无法将自定义对象序列化到属性列表中,也不能使用通过Cocoa Touch交付且未在之前的可序列化对象列表中指定的其他类,这也意味着无法直接使用NSURL、UIImage和UIColor等类。

下面通过实例来说明使用属性列表实现数据持久方法。创建一个single view application应用程序,在实现数据属性序列化之前,首先要当前应用程序的路径以及文件名,可以通过下面程序来获得存储文件的路径和创建文件名。

- (NSString*)dataFilePath
{
NSArray* paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentDirectory = [paths objectAtIndex:0];
return [documentDirectory stringByAppendingPathComponent:kFilename];
}

接着,我们需要实现程序推出时对数据进行持久化保存,也即存到文件中。此时,我们需要实现一个通知方法:applicationWillTerminate。该方法有一个指向NSNotification的指针参数。通知是一种对象可以用于彼此通信的轻量级机制,类似MFC的消息机制。本程序实现一个简单的序列化功能,主要是实现将一个textFiled控件的text内容写入文件中。该方法的实现代码如下。

- (void)applicationWillTerminate:(NSNotification *)notification
{
NSMutableArray* array = [[NSMutableArray alloc]init];
[array addObject:field1.text];
[array addObject:field2.text];
[array addObject:field3.text];
[array addObject:field4.text];
[array writeToFile:[self dataFilePath] atomically:YES];
}

除此之外,应用程序还需要做两件事:一是检查数据文件是否存在;二是如果文件存在,就用该文件的内容实例化数组,并将数组数据赋给对应的textFiled对象的text属性。该功能可以在viewDidLoad方法中实现,代码如下:

- (void)viewDidLoad
{
// Do any additional setup after loading the view, typically from a nib.
NSString* filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
NSArray* array = [[NSArray alloc]initWithContentsOfFile:filePath];
field1.text = [array objectAtIndex:0];
field2.text = [array objectAtIndex:1];
field3.text = [array objectAtIndex:2];
field4.text = [array objectAtIndex:3];
} UIApplication* app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:app]; [super viewDidLoad];
}

从属性列表加载数据之后,就获得了对应用程序的引用,并使用该引用订阅UIApplicationiWillTerminateNotification,使用默认的NSNotification实例以及一个名为addObserver:selector:name:object的方法。

实现结果如下所示:

该程序的源代码可以通过一下链接下载:http://download.csdn.net/detail/kezunhai/6194277

iphone开发中数据持久化之——属性列表序列化(一)的更多相关文章

  1. iphone开发中数据持久化之——嵌入式SQLite(三)

    前两篇分别讨论了使用属性列表的数据持久化.使用对象归档的数据持久化,本文将讨论第三个实现数据持久化的方法---嵌入式SQL数据库SQLite3.SQLite3在存储和检索大量数据方面非常有效.它还能够 ...

  2. iphone开发中数据持久化之——模型对象归档(二)

    在Cocoa世界中,术语“归档”是指另一种形式的序列化,它可以实现对任何对象的序列化.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们.只要在类中实现的每个属性都是标量(如 ...

  3. IOS开发中数据持久化的几种方法--NSUserDefaults

    IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...

  4. [Objective-C] 012_数据持久化_XML属性列表,NSUserDefaults

    在日常开发中经常要对NSString.NSDictionary.NSArray.NSData.NSNumber这些基本类的数据进行持久化,我们可以用XML属性列表持久化到.plist 文件中,也可以用 ...

  5. iOS开发中数据持久化

    使用几个小例子分别实现 归档NSKeyedArchiver.NSUserDefaults.plist文件数据存储,简单直观.代码地址

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

    iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起 ...

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

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

  8. iPhone开发中从一个视图跳到另一个视图有三种方法:

    iPhone开发中从一个视图跳到另一个视图有三种方法:   1.self.view addSubView:view .self.window addSubView,需要注意的是,这个方法只是把页面加在 ...

  9. iphone 开发中使用zbar时遇到的几个典型问题解决方法。

    iphone 开发中使用zbar时遇到的几个典型问题解决方法.   在近期的一个ios项目中使用到了一个二维码扫描库(Qrcode)--ZBar, 期间遇到2个问题.   1. zbar下载后使用其l ...

随机推荐

  1. Oracle数据库之PL/SQL触发器

    Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...

  2. 浏览器JS报错Uncaught RangeError: Maximum call stack size exceeded?

    JavaScript错误:Uncaught RangeError: Maximum call stack size exceeded 堆栈溢出 原因:有小类到大类的递归查询导致溢出 解决方法思想: A ...

  3. 分享29个超赞的响应式Web设计

    原文自:http://www.csdn.net/article/2013-01-16/2813678-responsive-design-websites 最近几年,响应式Web设计不断印入人们眼帘, ...

  4. windows7任务栏上的图标修复

    Technorati 标记: 疑难杂症   今天,我在使用Windows 7的时候,因为操作一些系统文件,发现桌面下角的个别正在运行的图标不见了,但是,我们如果再打开一个新程序,又会提醒你已经在运行了 ...

  5. spoj SORTBIT - Sorted bit squence

    Let's consider the 32 bit representation of all integers i from m up to n inclusive (m ≤ i ≤ n; m × ...

  6. 将日志写入EventLog

    将日志写入EventLog 面向Windows的编程人员应该不会对Event Log感到陌生,以至于很多人提到日志,首先想到的就是EventLog.EventLog不仅仅记录了Windows系统自身针 ...

  7. BZOJ 1021 循环的债务

    Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的 ...

  8. Tomcat8 配置Oracle11g数据源

    1:context.xml <Resource name="jdbcoracle" auth="Container" type="javax.s ...

  9. js 实现 aop

    Aop又叫面向切面编程,用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被严重忽视的技术点,这篇就通过下面这几个小例子,来说说AOP在js中的妙用. 1, 防止window.onloa ...

  10. Unity3d IOS中的IGUI控件

    Unity3d IOS中的IGUI控件 @灰太龙  群63438968 我讲一下IOS中用的UI,我们采用IGUI,需要使用IGUI的高版本,在Unity3d 4.2中也可以使用的! 之前IGUI有个 ...