在这里我就不照搬教科书上抽象的概念了.我觉得既然要把东西写出来就让它简单明了.
要搞清楚数据持久化,首先要知道数据持久化是相对于缓存而言的,缓存是在程序运行的过程中保存在内存中,程序一旦运行结束,其内存就会被释放.缓存在内存中的数据也就随之消失.
那么数据持久化就是要解决上述的这个问题,如常见的用处:保存用户设置的头像,昵称等这些重要信息.
解决的思路如下:将程序运行过程中需要保存的数据通过一定的形式(某些载体)保存起来而不是简单地在程序运行过程中缓存起来.此操作之后,在程序下次运行的时候可以再将这些数据从存储的载体中读取出来,那么我们也就实现了数据持久化
(保存的操作叫做序列化,读取解析操作叫反序列化)
简言之就是:将数据通过一定的形式保存起来并在需要时再读取解析就实现了所谓的数据持久化
1.文件存储
将需要的数据通过文件存储起来如:bin文件xml文件txt文件等等..
2.数据库存储
将数据保存到数据库相应的表字段中, 常见的数据库有SQLServer MySQL Oracle 以及SQLite
我们刚刚说到将数据保存到文件中,那么有文件就有文件保存的路径.
在IOS中,我们的应用将打包其文件到特定的文件夹(目录)中,这种个文件夹 叫做应用沙盒,每个应用都有自己的应用沙盒,并且每个沙盒之间是相互独立的.这样做的原因,两个字:安全.相互独立,也就是说程序无法随意篡改或删除其他程序的文件,浏览器中保存cookie的文件也是如此,不同域名有不同的cookie文件,并且无法访问其他域名下相关的cookie的文件...扯远了,有兴趣的朋友自己扩展
1) 拿到我们应用沙盒的根路径: NSHomeDirectory()
2) 步骤截图:
步骤一:在viewDidLoad:如下图所示,右边显示便是沙盒路径(复制)
步骤二:打开Finder 并按下快捷键cmd+shift+G 输入沙盒路径 并回车
步骤三,得到沙盒结构图
Document
Library/Caches
Library/Preferences
tmp
所以我们根据在存储数据文件的时候需要结合上面所列的目录特点,将对应的数据保存至适当的路径下面
两种方式:
1.拼接:
NSString homePath = NSHomeDirectory();//获取沙盒根路径
NSString documentPath = [ homePath stringByAppendingPathComponent:@"Documents"];
2.搜索目录
NSArray*pathArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);
NSString documentPath = [pathArray objectAtIndexOf :0];
1).什么是属性列表:
2).特点:
如:NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NSNumber,NSDate
3).代码
-(void)writeDictionaryToFile{ //1.初始化对象 NSDictionary *dic = @{ @"name":@"jack", @"country":@"China", @"province":@"GuangDong" }; //2.保存路径(Documents) NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; path = [path stringByAppendingPathComponent:@"testdic.plist"]; //3保存文件 [dic writeToFile:path atomically:YES]; }
程序运行后我们找到创建好的文件,打开效果如图:
-(void)readDictionaryFromFile{ //1.获取路径 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; path = [path stringByAppendingPathComponent:@"testdic.plist"]; //2.读取文件中的数据 NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:path]; NSLog(@"%@",dic); }
效果图(断点):