A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王博1 初级黑马   /  2016-5-26 09:55  /  691 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在移动端开发过程中,都会遇到一个问题,APP中的数据要存储在哪里呢?

IOS中数据的持久化保存这块内容,类似于Android中文件的几种常见的存储方式。
对于数据的持久化存储,ios中一般提供了4种不同的机制。
1.属性列表
2.对象归档
3.数据库存储(SQLite3)
4.苹果公司提供的持久性工具Core Data。

其实储存的形式无非就这么几种,而我们还必须要关心的是,这些文件会被放置在那个文件下,然后如何读取。
也就是说:IOS上数据存储,我们要了解的两点,数据存储格式(也就是存储机制),数据存储位置。
1》文件如何存储(如上面4点)
2》文件存储在哪里。
对于数据的操作,其实我们关心的是操作的速率。
就好比在Adnroid中偏好存储,数据库存储,io存储一样。

一:应用文件目录
首先我们来看了解下ios数据存储位置,因为只有知道位置路径我们才能去读取数据,而数据的持久化机制不过是针对操作速率来考虑的,
比如我们大致知道属性列表(既键值对形式)的存储熟虑应该高于数据库高于io文件流存储。
我们在选择用何种机制存储数据,主要也是看数据的形式。


Document:应用程序将其数据存储在这个文件夹下,基于NSUserDefaults的首选项的设置除外。

简单理解是,基本上我们要操作的一些数据都是存储在这个文件夹下面的

对于Document文件夹目录路径的获取,API提供了这么一种方法:

[cpp] view plain copy


  • NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  •    NSString *docPath = [paths objectAtIndex:0];  


Library:基于NSUserDefault首选项设置存储在其下Preferences文件夹中,简单来说,这个文件夹一般你很少操作到。

书上对于这部分基本没介绍。估计对于初级部分是跳过了。

Tmp:应用临时存储文件,当不需要时,应用负责删除其下的文件数据。

该文件也提供了目录获取方法:

[cpp] view plain copy


  • NSString *tmpDoc = NSTemporaryDirectory();  


应用程序文件:这个基本没提到书上,但是我们大致可以猜测,这就是整个应用程序的程序文件夹吧。

好了,以上我们大致解决了我们提到的第一个点,文件存储目录


二:数据存储机制

1.属性列表

这个其实我们早见过,plist就是,感觉用来存储键值对小数据是最合适,因为速率很高。

这个存储机制很简单,对于前面我们使用过了在plist文件来读取数据填充一些列表,只不过那会plist文件存储位置不同,

用的是Mainbundle什么的来返回文件夹,其实这边我也推测,上面提到有个应用程序文件夹,它下面的文件就是这么来读取的~(反正暂时不管他)

这边不过就是改变了存储位置,数据操作还是一样的

[cpp] view plain copy


  • NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  • NSString *docPath = [paths objectAtIndex:0];  
  • NSString *myFile = [docPath stringByAppendingPathComponent:@"my.list"];  
  • //读取文件  
  • NSArray *array = [[NSArray alloc] initWithContentsOfFile:myFile];  
  • //操作完若修改了数据则,写入文件  
  • [array writeToFile:myFile atomically:YES];  


2.对象归档

上面的属性列表存储机制,我们都知道,这个机制支持NSArray,NSDictionary,NSData,NSString,NSNumber,NSDate 等等

这些对象直接写入plist文件中。

那么对于一些复杂对象,我要保存整个这个对象数据呢?

反正我是这么觉得,这个机制很像java中的对象整体序列化。当然,这些数据在读取是就需要遵循一种墨守成规的协议了。

首先我们定义的对象类,必须实现NSCoding和NSCopying协议(额,网上说后面这个不实现也可以,我猜是他对象没有copy操作,因此没出错)书本上反

[cpp] view plain copy


  • #import "TestObj.h"  
  •   
  • @implementation TestObj  
  • @synthesize stringA = stringA;  
  • @synthesize stringB = stringB;  
  • #pragma mark -  
  • #pragma NSCoding协议实现实现  
  • - (void)encodeWithCoder:(NSCoder *)aCoder  
  • {   //encoder  
  •     [aCoder encodeObject:stringAforKey:@"1"];  
  •     [aCoder encodeObject:stringBforKey:@"2"];  
  • }  
  • - (id)initWithCoder:(NSCoder *)aDecoder  
  • {  
  •     //decoder  
  •     if (self = [superinit]) {  
  •         stringA = [[aDecoder decodeObjectForKey:@"1"] retain];  
  •         stringB = [[aDecoder decodeObjectForKey:@"2"] retain];  
  •     }  
  •     returnself;  
  • }  
  •   
  • #pragma NSCopying协议实现  
  • - (id)copyWithZone:(NSZone *)zone  
  • {  
  •     TestObj *copy = [[[selfclass] allocWithZone:zone] init];  
  •     copy.stringA = [[self.stringAcopyWithZone:zone] autorelease];  
  •     copy.stringB = [[self.stringBcopyWithZone:zone] autorelease];  
  •     return copy;  
  • }  
  • @end  


然后是对对象归档的读取和写入

[cpp] view plain copy


  • //读取归档文件  
  •    NSData *data = [[NSMutableDataalloc] initWithContentsOfFile:myFile];  
  •    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:data];  
  •    TestObj * test = [unarchiver decodeObjectForKey:@"data"];  
  •    [unarchiver finishDecoding];  
  •    [data release];  
  •    [unarchiver release];
  •    //写入归档文件  
  •    NSMutableData *data1 = [[NSMutableDataalloc] init];  
  •    NSKeyedArchiver *archiver = [[NSKeyedArchiveralloc] initForWritingWithMutableData:data1];  
  •    [archiver encodeObject:test forKey:@"data"];  
  •    [archiver finishEncoding];  
  •    [data writeToFile:myFile atomically:YES];  
  •    [data1 release];  
  •    [archiver release];  
  •    [test release];  

三.数据库存储
和Android一样,ios中也是用了SQLite3这种嵌入式数据库。

这个网上例子是很多了。我这边就大致看下了数据库的打开,

数据库表创建,查询,插入,这个大家学一下就ok了。



4。Core Data存储机制

大致浏览下基本感觉就是将对象归档搞成了可视化和简单化。

这块内容比较多。网上资料也挺丰富的。

暂时不做介绍了。


总结下:其实对于ios数据存储,最常用和主要要掌握的就是属性列表和数据库,因为两个是出镜率比较高的。

其他可能在数据存明显体现出储优势时,我们会去考虑用另外两种机制。

基础的来说,必须掌握属性列表和sqlite的操作存储。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马