您的位置:首页 > 移动开发 > IOS开发

iOS简单的数据持久化

2015-09-17 19:08 537 查看
首先,我们要了解: 什么是数据持久化? 我们为什么要做数据持久化?

数据持久化就是数据的永久存储. 我们在写demo或则是初学的时候, 很多的数据都是在AppDelegate.m中或者是在视图控制器中定义好了的. 然后我们会发现: 程序或demo每一次执行的时候都是初始化数据. 当我们需要深入研究数据时, 就需要数据的持久化.

iOS中常用的数据持久化方法有四种: 属性列表, 对象归档, SQLite, CoreData.

当程序执行后, 数据是存储在内存中的, 当程序关闭后, 内存会释放掉, 从而这些数据也会丢失. 因为这些数据都是临时的.

打个比方: 临时数据相当于是公司的车, 在需要你开车去办工的时候给你用一下, 用完了就要马上还回去. 而永久性的数据相当于你自己的车, 想怎么开怎么开.(ps:当然还是要遵守交通规则的).

数据持久化的本质其实就是将数据保存成文件, 存储到程序的沙盒中.

NSString *sandboxPath =NSHomeDirectory();//获取当前应用程序的沙盒主路径
NSString *tmpPath =NSTemporaryDirectory();//获取临时文件夹路径

NSString *docPath1 = [sandboxPathstringByAppendingPathComponent:@"Documents"];//因为沙盒文件夹中包含有三个文件,
在这里拼接Documents直接指向存储用户数据的Documents文件夹.
现在我们可以获取到具体的Documents文件夹路径了

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);//通过路径搜索函数获取对应的Documents文件夹路径(ps:注意提示,
不要写成NSDocumentationDirectory)
这里有三个参数. 第一个参数是: 被搜索的文件夹目录的枚举值. 第二个参数是:
被搜索的域(ps:iOS开发只有NSUserDomainMask可用). 第三个参数是: 是否显示完整路径, 这是一个BOOL值, YES表示返回完整路径, 如果写的是NO得话返回的是:"~/Documents".因为每一个沙盒路径中都有一个Documents文件夹,
所以我们需要用完整路径.

NSString *documentsPath = paths.firstObject;

NSString *textPath = [documentsPath
stringByAppendingPathComponent:@"text.tex"];//生成文本文件的存储路径

NSString *string =
@"好想养一只二哈~!";//创建需要被保存的字符串对象

[string writeToFile:textPath atomically:YES encoding:NSUTF8StringEncodingerror:nil];//将字符串写入对应路径的文件
运行程序后, 会将字符串添加到命名为text的.txt文件中, 因为没有text.txt, 所以会创建一个text.txt文件.
同理,我们可以对NSArray, NSDictionary, NSData等类及其子类的对象写入到指定路径的文件. 文件的类型可以是多种. 在这里比较多用的是XML(可扩展标记语言)



//指定数组的文件存储路径

NSString *arrayPath = [documentsPath
stringByAppendingPathComponent:@"array.plist"];

NSArray *array = @[@"Duke",
@"Douglas", @"Leo"];

//调用数组的writeToFile:atomically:方法将数组内容写入到文件中
[array
writeToFile:arrayPath
atomically:YES];

//定义一个字典的文件存储路径

NSString *dicPath = [documentsPath
stringByAppendingPathComponent:@"dic.plist"];

//创建字典对象

NSDictionary *dic = @{@"name":@"Linda",@"age":@30,@"gender":@"f"};

//调用字典中定义的实例方法writeToFile:atomically:将字典的内容写入到对应路径的文件中
[dic
writeToFile:dicPath
atomically:YES];

UIImage *image = [UIImage
imageNamed:@"image"];

NSData *imageData =
UIImageJPEGRepresentation(image, 0.2);//<#CGFloat compressionQuality#>0~1
代表了压缩百分比

NSString *imagePath = [documentsPath
stringByAppendingPathComponent:@"image.jpg"];

//将二进制字节流对象写入到文件中
[imageData
writeToFile:imagePath
atomically:YES];

对于复杂的对象无法通过writeToFile:方法进行数据持久化. 我们需要通过归档或者数据库等
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: