开篇点题。
http://blog.csdn.net/tianyitianyi1/article/details/7713103
我也是参考了这个人的博文才更加深入了解了数据存储模式。理论部分我就不在这里赘述了。
小生说过,不做文字的搬运工,坚持内容原创。
下面谈一谈我的理解。
我们可以再进一步把数据存储模式细分一下,可以分为如下几类:
1 XML属性列表(plist)归档
2 Preference(偏好设置)
3 NSKeyedArchiver归档(NSCoding)
4 SQLite3
5 Core Data
而这个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语句将他拆分。
另外,这里涉及一个知识就是沙盒。每个应用都有自己的沙盒,通俗的讲就是每个应用的档案库。这些数据文件都存在沙盒目录中。
在沙盒目录中,有着以下的几种资源文件:
应用程序包:(上图中的Layer)包含了所有的资源文件和可执行文件
Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录
Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据
Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录
由于小生目前开发还并不涉及多种数据存储方式并行,所以也不好妄加言辞。随着我继续深入的学习,后续会继续更新。