[ios] 关于iOS 的几种数据存储模式

开篇点题。

http://blog.csdn.net/tianyitianyi1/article/details/7713103       

我也是参考了这个人的博文才更加深入了解了数据存储模式。理论部分我就不在这里赘述了。


小生说过,不做文字的搬运工,坚持内容原创。


下面谈一谈我的理解。


我们可以再进一步把数据存储模式细分一下,可以分为如下几类:

1 XML属性列表(plist)归档

2 Preference(偏好设置)

3 NSKeyedArchiver归档(NSCoding)

4 SQLite3 

5 Core Data


先说前两种,为什么把前两种归位一类呢?前两种其实本质都是plist,也就是xml文件存储。

而这个plist并不是省油的灯,在plist中只能存储系统自带的一些常规的类,字符串/字典/数据/NSNumber/NSData ... 也就是有writeToFile方法的对象才可以使用plist保存数据。

如果想要直接存储自定义的类,那是不可以的。

例如我门钥匙存储一个自定义的类,person,那只能采取以下的方式曲线救国了。

NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)lastObject];

NSString *path = [docstringByAppendingPathComponent:@"xxx.plist"];

 NJPerson *p = [[NJPersonalloc] init];

    p.name =@"lnj";

  NSDictionary *dict = @{@"person": @"xxx"};

 [dict writeToFile:pathatomically:YES];



读取数据也采取相同的方式:

NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)lastObject];

    

NSString *path = [docstringByAppendingPathComponent:@"xxx.plist"]

    ;

    // 读取数据

NSDictionary *dict = [NSDictionarydictionaryWithContentsOfFile:path];



这样繁重的代码显然是我们不愿意看到的。于是才有了第二种偏好设置,他的本质与第一种方式雷同,但是代码要简单不少:

// 偏好设置是专门用来保存应用程序的配置信息的,一般情况不要再偏好设置中保存其他数据

// 如果利用系统的偏好设置来存储数据,默认就是存储在Preferences文件夹下面的

// 偏好设置会将所有的数据保存到同一个文件中

    

    // 获取NSUserDefaults对象

    NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];

    //保存数据(如果设置数据之后没有同步,会在将来某一时间点自动将数据保存到Preferences文件夹下面)

    [defaults setObject:@"lnj"forKey:@"name"];

    [defaults setObject:@"man"forKey:@"gender"];

    [defaults setInteger:13forKey:@"age"];

    [defaults setDouble:10.1forKey:@"height"];

    

    // NSUserDefaults立刻保存数据

    [defaults synchronize];


但是这样保存,虽然相对比较简单,但是由于大量的数据智能存入一个plist中,这样在查找起来会非常的头痛。所以这种方式一般存储一些系统的设置文件,比如用户名,字体大小,是否登陆等等,轻易不要使用。



第三种就是我们所熟悉的归档了。这里代码部分在文章开头的链接中有详细介绍,我就不赘述了。

简而言之,如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复

不过,不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以

NSCoding协议有2个方法:

encodeWithCoder:

每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量

initWithCoder:

每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量


这种方法在实际项目中用到的很多,后面我会详细就归档问题进行讨论。

这个主要用于对于模型的对象归档。





最后两种是sqlite3,和core data,本质上都是一样的。sqlite3数据库,属于典型的“小快灵”样式的数据库,专门为移动终端而生。当然了,你不能拿他去和oracle去比较,这根本没有可比性。sqlite是关系数据库,同样不能直接存储对象。必须要编写sql语句将他拆分。


core data是苹果自己搞的,比sqlite3牛x。 虽然core本质是sqlite,但是这货可以存储对象。在项目中也是经常应用的。



以上就是对于这几种存储方式的个人理解啦。当然,肯定有很多说的不到位的地方,欢迎拍砖~
当然,这个说的只是比较浅显的,具体的使用,对于性能的研究,还是需要学习。学无止境嘛





另外,这里涉及一个知识就是沙盒。每个应用都有自己的沙盒,通俗的讲就是每个应用的档案库。这些数据文件都存在沙盒目录中。

在沙盒目录中,有着以下的几种资源文件:

应用程序包:(上图中的Layer)包含了所有的资源文件和可执行文件

Documents:保存应用运行时生成的需要持久化的数据iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录


tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录


Library/Caches:保存应用运行时生成的需要持久化的数据iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据


Library/Preference:保存应用的所有偏好设置iOSSettings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录


由于小生目前开发还并不涉及多种数据存储方式并行,所以也不好妄加言辞。随着我继续深入的学习,后续会继续更新。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值