首先,我们要了解: 什么是数据持久化? 我们为什么要做数据持久化?
数据持久化就是数据的永久存储. 我们在写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];