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

          数据持久化是应用程序开发过程中的一个基本问题,对应用程序中的数据进行持久化存储,有多重不同的形式。本系列文章将介绍在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       

原文地址:https://www.cnblogs.com/suncoolcat/p/3297358.html