iOS 数据持久化之属性列表

  • iOS 中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在 iOS 开发过程中,总会遇到需要持久存储数据的这样用户才能对应用进行操作胡,再次启动能看到自己更改过的结果与痕迹.
  • 所以在 iOS 开发中,我们需要数据持久化这一种技术,也需要不断在实际开发的工作与学习中完善数据持久化这已开发技术.
  • 有四种数据持久化的方法:分别是,属性列表.对象的归档与解档.数据库 sqlite3的运用以及 coreData 的运用.

在介绍4中持久化存储方式前,我们先需要了解3个有关的文件夹.以及什么是沙盒机制.

  • -Documents; 应用会将数据存储在这个文件夹里,但是基于 NSUserDefauls 的首选项设置除外;
    • Library; 基于NSUserDefauls的首选项设置存储在 library\Preferences 文件夹中.且 Library 下面有 Preferences 和 Caches 目录.
    • tmp; 供应用存储临时文件,当 iOS 设备进行同步操作时, iTunes 并不会备份这个文件夹的文件,但是在不需要这些文件的时候.应用需要删除 tm 中的这些文件.以免占用文件系统空间.

什么是沙盒机制

我们手中 iPhone/iPad 设备上包含着闪存,它的功能和一个硬盘功能等价.当设备断电后数据依然能够保存下来,应用程序可以把数据文件保存到闪存上.并且读取它们,但是,需要注意的是.我们所开发的应用程序是无法访问整个闪存的,因为闪存上面会专门有一部分给我们,这一部分就是属于我们开发的这个应用程序的沙盒(sandBox)了.iOS 系统中,每个应用都只能看到自己的沙盒.这就是防止对其它应用程序的数据文件进行读写活动.就像我们的应用程序也能够看到一些系统拥有的高级别目录,但是却无法尽心任何的写入操作.

那么,如何获取自己的目录?

1.获取Documents目录
由于 iOS 中应用的数据存储是沙盒机制,因此读取和写入文件.我们需要调用 C 函数NSSearchPathForDirectoriesInDomains()来查找各种目录,(这个 C 函数可以基于 Mac OSX 平台的 cocoa 共享)
如检索Documents目录路径的代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*pathDirectory=  [paths objectAtIndex:0];
//第一个常量NSDocumentDirectory表示我们正在查找目录的路径,第二个常量
NSUserDomainMask表明我们希望将搜索限制在应用的沙盒内;(在 Mac OSX 中,此常量表示我们希望该函数查看用户的主目录,因此才会有这个命名);

//返回的一个数据 paths, 为什么位于索引0就是我们需要的 Document 目录?因为每一个应用只有一个 Document 目录,一次只有一个目录符合这个条件;接下来,我们可以为刚才检索到的目录 pathDirectory 的结尾加上一个字符串来创建一个文件名.如下;

NSString *filename = [pathDirectory stringByAppendingPathComponent:@"data.txt"];

这个时候我呢得到的 filename 字符串就可进行创建\读取\写入文件了
2.获取 tmp 目录;
可以用NSTemporaryDirectory()Foundation 函数返回一个字符串,该字符串包含到应用临时目录的完整路径.同上.在结尾附上文件名就可以创建指向该目录下的文件路径了.

NSString *tmpPath = NSTemporaryDirectory();
NSString *temFile = [tmpPath stringByAppendingPathComponent:@"tempFile.txt"];
  • 一.属性列表
    什么是序列化对象:
    序列化对象,是指可以被转换为字节流以便于存储到文件中或者通过网络进行传输的对象;
    虽然说任何对象都可以被序列化,但是只有某些特定的对象才能防止到某个集合类(例如; NSArray\NSMutalbleArray\NSDictionary\NSData 等)中,并使用该集合类的方法在属性列表存储中使用,其他的对象也可以使用归档的方法进行存储.
    简单的使用一下.具体的功能效果如图1,可以让用在4个文本框中输入数据,应用退出时会把这些字段保存到属性列表中,便在下次启动时重现加载恢复上次的数据;
图1.png

在 Xcode 中,使用 Single View Application 模板创建一个新的项目,命名规则随意. 在main.storyboard中拖入4个标签,4个文本框架,拖动并对齐标签与文本框,并依次修改标签文本如图1,ViewController. h中添加一个装载4个文本框的数组.lineFields;

#import
@interface ViewController : UIViewController
@property (strong,nonatomic)
IBOutletCollection(UITextField) NSArray *lineFields;@end

打开辅助编辑器,通过control键将4个文本框连接到 lineFields 这个数组,确保连接顺序为从顶部到底部!
在项目导航面板中,点击”ViewController.m” ,将以下代码添加到@implementation与 @end 的中间,这个方法在后面会一直调用:

/获取属性列表路径中数据文件的完整路径 dataFilepath
//需要加载和保存数据的代码都可以调用该方法.
-(NSString *)dataFilepath{
 
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *pathDirectory = [paths objectAtIndex:0]; 
return [pathDirectory stringByAppendingPathComponent:@"data.txt"];
}

接下来,在viewDidload中添加代码,并添加相应的响应器方法:

- (void)viewDidLoad { 
[super viewDidLoad];
 
NSString *filePath = [self dataFilepath]; 
 
//判断是否存在属性列表文件 
if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { 
//存在,则把数据赋值给文本框 
NSArray *ar= [[NSArray alloc]initWithContentsOfFile:filePath]; 

这段代码的意思是,首先检查完整路径下的数据文件是否存在,不存在的话就不加载了.
若存在,则把数组中的对象赋值到4个文本框中,根据刚才我们创建数组lineFields的时候,与文本框的连接顺序,就可以把数据赋值给文本框了.
人后在应用终止或者进入后台之前记性数据的保存处理,所以我们使用通知中心,订阅了名为"UIApplicationWillResignActiveNotification"的通知,并在后面事项了applicationWillResignActiveNotification这个方法.
当用户按下 home键时,或者其他事件发生(比如来电)导致应用进入后台的情况下,变调此方法,把字符串数组写入我们创建的属性列表文件里面.
如果没有其他问题的话,我们可以分别键入4个文本框,然后点击Home键(也就是command+shift+H)、双击Home键(按住command+shift,双击H),或者在Xcode中终止应用退出模拟器(相当于手机重启),以验证数据在应用得到永久保存了。
总结:属性列表的序列化很实用,也相对比较简单,但是也会有点限制,就是只能讲一小部分对象保存在属性列表中.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容