IOS(数据持久化1)

 

在IOS应用中数据持久化是客户端重要的东西。一般除了本地持久化就是与服务器交互数据从网上获取了,但是如果没有网络的情况下。本地持久化是必须的。一般持久化有4种方法。现在一一介绍,对于网络的就以后介绍。

 

第一种:实用属性列表,第二种:对象归档,第三种:使用Iphone的嵌入式数据库(SQLite3)

给予Iphone应用程序沙盒原理,我们保持的数据都是保存在相对应的应用程序的Document文件夹。既然我们把数据放在每一个应用的Document文件夹中,呢我我们怎么得到相应的路径呢,其实也不是很难。下面是检索文档目录路径的代码:

NSArray*paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserdomainMask, YES);

NSString*documentDirectory = [paths objectAtIndex:0];

常量NSDocumentDirectory表面我们正在查找的Document目录路径,常量NSUserDomainmask表明我们希望将搜索限制于我们应用程序的沙盒中。这样我们就可以得到该数组的第一值,也仅此一值,因为每一个应用程序只有一个Document文件夹。我们得到了Document的路径,然后和文件名相连接不就是一个完整的路径了吗,这用到了stringByAppendingPathComponent方法:

NSString*filepath = [documentDirectorystringbyAppendingPathComponent:@"filename.xxx"];其中filename.xxx为要命名的文件。

 

在每一个应用程序中还对应一个temp文件夹,我们怎么获取这个文件夹的路径呢,也比较简单:

NSString*tempPath = NSTemporaryDirectory();

NSString*filePath = [tempPathstringByAppendingPathComponent:@"filename.xxx"];

 

NSUserDefaults类的使用和NSKeyedArchiver有很多类似之处,但是查看NSUserDefaults的定义可以看出,NSUserDefaults直接继承自NSObject而NSKeyedArchiver 继承自NSCoder。这意味着NSKeyedArchiver实际上是个归档持久化的类,也就可以使用NSCoder类的[encodeObject: (id)objv forKey:(NSString *)key]方法来对数据进行持久化存储

除了上面的三种方法来保存持久化 数据以外,我们还可以用写文件到磁盘的方式来保存持久化数据

嵌入式数据库持久化数据就是把数据保存在iphone的嵌入式数据库系统SQLite3中,本质上来说,数据库持久化操作是基于文件持久化基础之上的。 要使用嵌入式数据库SQLite3,首先需要加载其动态库libsqlite3.dylib,这个文件位于/Xcode3.1.4/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/lib目录下

 

 

Core Data是一种 稳定,功能全面的持久化工具,和之前的一些持久化 工具相比,他不需要对实体进行归档,也就是序列化,而是在数据 模型编辑器中创建一些实体

在代码中,你不再使用存取方法和修改方法,而是使用键值对编码来设置属性或者减缩他们的值

那么这些托管对象的活动区域在哪 ?  他们位于所谓的持久库中,默认情况下,Core Data应用程序将持久库实现为存储在应用程序文档目录的sqlite数据库。

虽然数据是通过sqlite存储的,但框架中的类将完成加载和保存数据的相关工作。不许要编写任何sql语句。

其实在Iphone上存储数据是在iPhone系统中存储数据的,这里可以包括应用程序和互联网的一些数据信息。我们可以解析和读取这些数据。首先我们先了解下数据持久化的几种方式:首先是属性列表。nsuserdefaults位于属性列表的最顶层,我们可以在里面添加一些UI的小单元

还有就是iPhone的应用程序沙盒技术,以及对象的归档,以及第三方的SQLlite,还有就是coredata。

首先让我们说说这个属性列表:它是存储相对较小数据量的简洁方式,并且耗费非常低的工作量。但是这个属性列表也是有限制的像刚才我说的存储数据量小的数据,还有就是一些自定义的对象是不能存储的,只能是支持序列化的对象,想字典,数据,字符串,对了 还是不能添加UI界面的东西。他们可以以两种不同的方式存储一个是XML,这个XML是一种可读性非常强的格式,另一个是内部专门有的2进制的格式,这种方式速度更快写,数据量更小些。正如我们所说的NSuerdefaults位于属性列表的顶层,因此我们可以轻松的读取并且存储数据。

下面我们说说有几种情况来说明有些数据是不能存储的:比如你有大量的几百兆的数据这样是不行的,还有是一堆的图像,你将不会选择这个方式,因为你任何时候加载一个属性列表的时候他们是完全在家在内存当中的,知道一个完整的图片被创建,因此这种方式是不适用随机访问的。假如有两个线程一个是写入一个是读取这是不能同步的,同步会出现一些问题的,这是为什么呢,因为属性列表没有类似有原子性的东西。我们会有两种方式把他们写在硬盘内writetofile:@"文件路径"atomically:yes。这个原子性是什么意思呢,在这里可以这样的理解,它可以让系统写入文件一次首先是把它写入到一个临时的文件后然后在将其转移到可你以放置任何文件的没有风险的地方这里将保存着先前的文件以及任何改动的地方,因此如果操作 系统崩溃或者电池电量的耗尽的时候你也不会丢失任何的数据的。你可以从你先前的或者新的数据里获取数据而非受破坏的中间的状态。当你在写一个属性列表的时候如果你看XML和2进制。自定义和一些UI的视图不支持这些东西取决与可不可以序列化对象,当然不可以序列化,即使你序列化这些不能序列化的东西它会返回空值的。

posted @ 2012-09-04 10:12  人魔七七  阅读(2964)  评论(0编辑  收藏  举报