IOS的四种数据存储方式及优劣

IOS有四种经常使用数据存储方式:
第一种方法:用NSUserDefaults存储配置信息
NSUserDefaults被设计用来存储设备和应用的配置信息,它经过一个工厂方法返回默认的、也是最经常使用到的实例对象。这个对象中储存了系统中用户的配置信息,开发者能够经过这个实例对象对这些已有的信息进行修改,也能够按照本身的需求建立新的配置项。他其实是存储于文件沙盒中的一个.plist文件,而且没有被系统加密,只是ios6之后不是存于经常使用的文档目录下,因此不破解系统是看不到该文件的。因此该种方法储存的数据并非很很安全,若想存储安全仍是靠你本身的加密算法。通常这种方法存储少许信息,如果存储大量信息,如存储一百个数据你怎么记录键值啊?它能够在代码的任何部分存储数据,你不知道你整个应用存储了多少数据,因此它不利于统一管理,不建议采用。就是你把存储数据的函数统一放在一个文件中便于管理,可是你不能保证别人也遵循你的意志与作法啊,因此最好用第二种对象存储比较好。全部的机密数据都存储在一个对象中,一看就知道了,删除和添加很方便,便于管理。做为合格的码农,别说那么多应该和不应是,业务逻辑决定不会有这样的数据这样苍白的话,要从机制上杜绝各类异常数据。如:对象存储,在全部函数入口对参数进行合法性判断。ios

+ (void)setUserDefaultsValue:(id)value key:(NSString *)key
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    [userDefaults setObject:value forKey:key];
    [[NSUserDefaults standardUserDefaults] synchronize];

}

+ (id)objectForKey:(NSString *)key
{
    return [[NSUserDefaults standardUserDefaults] objectForKey:key];
}

调用:
NSString *selectedKey = [[NSUserDefaults standardUserDefaults] objectForKey:@”selectedKey”];web

第二种方法:方法用CoreData对象存储。像MFC等称之为序列化和反序列化,MFC是实际上存于应用对应的数据库表单中。他其实是把文件存在文件沙盒中,对应的是文档目录,因此用户能够看到该文件,系统对该文件进行了加密。通常文件名的后缀是.archiver。这样对那些不想设计加密算法,又想加密数据的人是个不错的福音。
一个支持持久化的,对象图和生命周期的自动化管理方案。它的数据也是存于系统数据库中应用对应的表中,因此能够用于存储机密数据(如:用户名和密码),能够存储各类数据。通常超大的数据,如:图片,行程记录存在文件沙盒中,不适合用这种对象存储,除非你的行程数据很机密,而且数据不可能超大,才考虑对象存储。严格意义上说CoreData是一个管理方案,他的持久化能够经过SQLite、XML或二进制文件储存。如官方定义所说,CoreData的做用远远不止储存数据这么简单,它能够把整个应用中的对象建模并进行自动化的管理。他和微软的MFC::CArchive实现对象的持久化和反持久化同样只能支持支持具备序列化的函数,把对象分解成基本数据类型的类型的持久化,如字符串,整形数字,浮点型数据,字符。因为持久化的对象数据都在一个对象中,因此他利于数据管理。因此采用CoreData存储数据就不须要采用NSUserDefaults数据存储数据了。
-(id)initWithDictionary:(NSDictionary*)dic
{
if (self=[super init])
{
self.sex=[dic[@”sex”] intValue];
self.driverYear=[dic[@”driverYear”] intValue];
}算法

return self;

}数据库

-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:[NSNumber numberWithInt:self.driverId] forKey:@”id”];
[aCoder encodeObject:[NSNumber numberWithInt:self.sex] forKey:@”sex”];缓存

}
-(id)initWithCoder:(NSCoder *)aDecoder
{
if (self=[super init])
{
self.sex=[[aDecoder decodeObjectForKey:@”sex”] intValue];
self.driverYear=[[aDecoder decodeObjectForKey:@”driverYear”] intValue];
}
return self;
}安全

//清理用户信息
- (void)clearUserInfo{
    NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [documents stringByAppendingPathComponent:@"user.archiver"];
    User *user;
    [NSKeyedArchiver archiveRootObject:user toFile:path];
}

//保存
-(void)saveinfo:(User *)user
{
    if(nil != user)
    {
        NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *path = [documents stringByAppendingPathComponent:@"user.archiver"];
        [NSKeyedArchiver archiveRootObject:user toFile:path];
    }
}

//获得用户信息
-(User *)getUserinfo;
{
    NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [documents stringByAppendingPathComponent:@"user.archiver"];//拓展名能够本身随便取
    User *user = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    return user;
}

//从对象沙盒中读文件
        User*user=[[GlobalShare getGlobalShare] getUserinfo];

        [GlobalShare getGlobalShare].user = user;
        [GlobalShare getGlobalShare].user.orderLastLatitude = 0;
   // 保存在本地
       [[GlobalShare getGlobalShare] saveinfo:user];

第三种方法:文件沙盒存储
主要存储非机密数据,大的数据。如:下载的图片,没有键值的分行记录。注意若系统被破解了你的沙盒中的文件能够被别人得到。这种方法操做很简单。不知道为什么不少介绍数据存储的文章为什么把这种最多见的,最简单直接的方式给忽略了。文件沙盒经常使用的文件通常存储于文档文件目录(NSDocumentDirectory非破解系统,用户能够直接看到)和缓存文档目录(NSCachesDirectory非破解系统,用户不可见)。看来天下文章一大抄啊!
//写文件
+ (void)writeToDocumentWithImageData:(NSData )data name:(NSString )fileName
{
NSString *path = [self filePath:fileName];svg

[data writeToFile:path atomically:YES];

}
//获取文件路径
+ (NSString*)filePath:(NSString*)fileName {
NSArray* myPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* myDocPath = [myPaths objectAtIndex:0];
NSString* filePath = [myDocPath stringByAppendingPathComponent:fileName];
return filePath;
}
第四种方法:数据库存储
iOS的SDK里预置了SQLite的库,开发者能够自建SQLite数据库。SQLite每次写入数据都会产生IO消耗,把数据归档到相应的文件。
SQLite擅长处理的数据类型其实与NSUserDefaults差很少,也是基础类型的小数据,只是从组织形式上不一样。开发者能够以关系型数据库的方式组织数据,使用SQL DML来管理数据。 通常来讲应用中的格式化的文本类数据能够存放在数据库中,尤为是相似聊天记录、Timeline等这些具备条件查询和排序需求的数据。
不管你采用系统自带的仍是用的SQLight第三方库的数据存储本质都数据库存储,不必再另外分类。数据存储稍微麻烦,而且存储的速度较慢,只有真正须要用到的地方才采用这种方式,如:聊天记录,地图地理信息查询。函数