IOS的四种数据存储方式及优劣
IOS有四种经常使用数据存储方式:
第一种方法:用NSUserDefaults存储配置信息
NSUserDefaults被设计用来存储设备和应用的配置信息。它通过一个工厂方法返回默认的、也是最经常使用到的实例对象。
这个对象中储存了系统中用户的配置信息,开发人员能够通过这个实例对象对这些已有的信息进行改动。也能够依照自己的需求创建新的配置项。
他实际上是存储于文件沙盒中的一个.plist文件,而且没有被系统加密,仅仅是ios6以后不是存于经常使用的文档文件夹下,所以不破解系统是看不到该文件的。所以该种方法储存的数据并非非常非常安全,若想存储安全还是靠你自己的加密算法。一般这样的方法存储少量信息,若是存储大量信息。如存储一百个数据你怎么记录键值啊?它能够在代码的不论什么部分存储数据,你不知道你整个应用存储了多少数据,所以它不利于统一管理。不建议採用。就是你把存储数据的函数统一放在一个文件里便于管理,可是你不能保证别人也遵循你的意志与做法啊。所以最好用另外一种对象存储比較好。
全部的机密数据都存储在一个对象中。一看就知道了。删除和加入非常方便,便于管理。作为合格的码农,别说那么多应该和不该是,业务逻辑决定不会有这样的数据这样苍白的话。要从机制上杜绝各种异常数据。如:对象存储。在全部函数入口对參数进行合法性推断。
+ (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”];
另外一种方法:方法用CoreData对象存储。像MFC等称之为序列化和反序列化,MFC是实际上存于应用相应的数据库表单中。他实际上是把文件存在文件沙盒中。相应的是文档文件夹,所以用户能够看到该文件。系统对该文件进行了加密。
一般文件名称的后缀是.archiver。
这样对那些不想设计加密算法。又想加密数据的人是个不错的福音。
一个支持持久化的,对象图和生命周期的自己主动化管理方案。
它的数据也是存于系统数据库中应用相应的表中,所以能够用于存储机密数据(如:username和password)。能够存储各种数据。一般超大的数据。如:图片。行程记录存在文件沙盒中。不适合用这样的对象存储,除非你的行程数据非常机密。而且数据不可能超大,才考虑对象存储。
严格意义上说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];
第三种方法:文件沙盒存储
主要存储非机密数据。大的数据。
如:下载的图片,没有键值的分行记录。注意若系统被破解了你的沙盒中的文件能够被别人获得。
这样的方法操作非常easy。不知道为何非常多介绍数据存储的文章为何把这样的最常见的,最简单直接的方式给忽略了。
文件沙盒经常使用的文件一般存储于文档文件文件夹(NSDocumentDirectory非破解系统,用户能够直接看到)和缓存文档文件夹(NSCachesDirectory非破解系统,用户不可见)。
看来天下文章一大抄啊!
//写文件
+ (void)writeToDocumentWithImageData:(NSData )data name:(NSString )fileName
{
NSString *path = [self filePath:fileName];
[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第三方库的数据存储本质都数据库存储,不是必需再另外分类。数据存储略微麻烦,而且存储的速度较慢,仅仅有真正须要用到的地方才採用这样的方式。如:聊天记录,地图地理信息查询。
IOS的四种数据存储方式及优劣的更多相关文章
- Android四种数据存储方式
一.SharedPreference数据存储篇 1.作用范围 (1).它是一种轻型的数据存储方式 (2).本质是基于XML文件存储key-value键值对数据 (3).通常用来存储一些简单的配置方式 ...
- IOS开发数据存储篇—IOS中的几种数据存储方式
IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09 421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...
- 怎样实现IOS开发中的数据存储方式
iOS 开发中,一般有如下几种数据存储方式.需要根据具体的业务场景,选择 合适的数据存储方式. (1) 用户默认设置 – 这种情况通常不需要用户干预,如游戏通关信息,Video 播放记录,或者 Ap ...
- Android编程中的5种数据存储方式
Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...
- Android五种数据存储方式
android 五种数据存储 :SharePreferences.SQLite.Contert Provider.File.网络存储 Android系统提供了四种存储数据方式.分别为:SharePre ...
- Android中的5种数据存储方式
本文转自 http://hi.baidu.com/maguowei/blog/item/7aca46c25574a33ae5dd3ba4.htmlAndroid数据存储Android提供了5种方式存 ...
- 四种数据持久化方式(下) :SQLite3 和 Core Data
在上文,我们介绍了iOS开发中的其中2种数据持久化方式:属性列表.归档解档. 本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文 ...
- iOS常用的几种数据存储方式
之前由于刚入行不久,对数据持久化不是很了解,尤其是用数据库存储大量数据的操作.经过摸索就在此总结一下,方便以后查阅 下面就简单介绍一下: 1.NSUserDefaults 感觉最常用的小量数据,属性, ...
- 【hive】——Hive四种数据导入方式
Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...
随机推荐
- matlab subplot(figure)如何设置使得图像最终显示出来不一样大小
1. 问题描述 figure subplot(1, 2, 1), imshow(A) subplot(1, 2, 2), imshow(B) 无论 A 和 B 的 size 是否一致,最终显示出来的 ...
- E. Reachability from the Capital(tarjan+dfs)
求联通分量个数,在dfs一次 #include <iostream> #include <algorithm> #include <cstring> #includ ...
- vSphere VCSA5.5加入AD域环境问题记录
vSphere VCSA5.5加入AD域环境问题记录 实验目的: 搭建一套vSphere VCSA5.5,并加入新搭建的AD域,并使用一个域用户登录VC,赋予对VC的只读权限. 实验环境: 使用VMW ...
- 洛谷P1108 低价购买 (最长下降子序列方案数)(int,long long等 范围)
这道题用n方的算法会很好做 我一开始想的是nlogn的算法求方案数, 然后没有什么想法(实际上也可以做,但是我太弱了)我们就可以根据转移方程来推方案数,只是把max改成加,很多动规题 都是这样,比如背 ...
- vmware启动虚拟机报错VMware Workstation has paused this virtual machine because the disk on which the virtual machine is stored is almost full. To continue, free an additional 1.4 GB of disk space.
报错VMware Workstation has paused this virtual machine because the disk on which the virtual machine i ...
- xcode 4 svn配置(host is unreachable)
xcode 4 svn配置 先保证你的xcode中已经安装了command line tools xcode -> preferences -> downloads -> comma ...
- java教程(五)SSH框架-配置
前言:从这篇博客開始我将继续讲述Java教程:SSH篇.主要内容环绕SSH框架分析与搭建,今天先简介一下SSH的配置. SSH配置顺序是: spring-->hibernate-->str ...
- java调用com组件将office文件转换成pdf
在非常多企业级应用中都涉及到将office图片转换成pdf进行保存或者公布的场景,由于pdf格式的文档方便进行加密和权限控制(类似于百度文库).总结起来眼下将office文件转换 成pdf的方法主要有 ...
- BZOJ 3236 莫队+树状数组
思路: 莫队+树状数组 (据说此题卡常数) yzy写了一天(偷笑) 复杂度有点儿爆炸 O(msqrt(n)logn) //By SiriusRen #include <cmath> #in ...
- HDU 5446 Unknown Treasure Lucas+中国剩余定理+按位乘
HDU 5446 Unknown Treasure 题意:求C(n, m) %(p[1] * p[2] ··· p[k]) 0< n,m < 1018 思路:这题基本上算是模版题了 ...