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的四种数据存储方式及优劣的更多相关文章

  1. Android四种数据存储方式

    一.SharedPreference数据存储篇 1.作用范围 (1).它是一种轻型的数据存储方式 (2).本质是基于XML文件存储key-value键值对数据 (3).通常用来存储一些简单的配置方式 ...

  2. IOS开发数据存储篇—IOS中的几种数据存储方式

    IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...

  3. 怎样实现IOS开发中的数据存储方式

    iOS 开发中,一般有如下几种数据存储方式.需要根据具体的业务场景,选择 合适的数据存储方式. (1)  用户默认设置 – 这种情况通常不需要用户干预,如游戏通关信息,Video 播放记录,或者 Ap ...

  4. Android编程中的5种数据存储方式

    Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...

  5. Android五种数据存储方式

    android 五种数据存储 :SharePreferences.SQLite.Contert Provider.File.网络存储 Android系统提供了四种存储数据方式.分别为:SharePre ...

  6. Android中的5种数据存储方式

    本文转自  http://hi.baidu.com/maguowei/blog/item/7aca46c25574a33ae5dd3ba4.htmlAndroid数据存储Android提供了5种方式存 ...

  7. 四种数据持久化方式(下) :SQLite3 和 Core Data

    在上文,我们介绍了iOS开发中的其中2种数据持久化方式:属性列表.归档解档. 本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文 ...

  8. iOS常用的几种数据存储方式

    之前由于刚入行不久,对数据持久化不是很了解,尤其是用数据库存储大量数据的操作.经过摸索就在此总结一下,方便以后查阅 下面就简单介绍一下: 1.NSUserDefaults 感觉最常用的小量数据,属性, ...

  9. 【hive】——Hive四种数据导入方式

    Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...

随机推荐

  1. zzulioj--1778-- 和尚特烦恼4——有多少战斗力(gcd)

    1778: 和尚特烦恼4--有多少战斗力 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 259  Solved: 123 SubmitStatusWe ...

  2. 构造函数的理解(构造函数与 init 方法)

    0. 构造函数与 init 方法 构造方法内部禁止添加任何业务逻辑,如果有业务逻辑,请放在 init 方法中: 1. 构造函数的参数 以下为一个堆实现优先队列(堆的实现借助完全二叉树,而完全二叉树又可 ...

  3. opencv——图像的灰度处理(线性变换/拉伸/直方图/均衡化)

    实验内容及实验原理: 1.灰度的线性变换 灰度的线性变换就是将图像中所有的点的灰度按照线性灰度变换函数进行变换.该线性灰度变换函数是一个一维线性函数:f(x)=a*x+b 其中参数a为线性函数的斜率, ...

  4. 13-Linux中进程与线程的概念以及区别

    linux进程与线程的区别,早已成为IT界经常讨论但热度不减的话题.无论你是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.对于一般的程序员,搞清楚二者的概念并在工作中学会运用是 ...

  5. 【Henu ACM Round#19 E】 Om Nom and Candies

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 紫书上的原题: 链接 [代码] #include <bits/stdc++.h> #define ll long lon ...

  6. 【Henu ACM Round#19 B】 Luxurious Houses

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 从右往左维护最大值. 看到比最大值小(或等于)的话.就递增到比最大值大1就好. [代码] #include <bits/std ...

  7. ECNUOJ 2150 完美的拯救

    完美的拯救 Time Limit:1000MS Memory Limit:65536KBTotal Submit:147 Accepted:50 Description  一只可怜的蚂蚁被万恶的魔术师 ...

  8. [Python] Normalize the data with Pandas

    import os import pandas as pd import matplotlib.pyplot as plt def test_run(): start_date='2017-01-01 ...

  9. Android中System.currentTimeMillis()

    函数: System.currentTimeMillis(): 功能:产生一个当前的毫秒,这个毫秒事实上就是自1970年1月1日0时起的毫秒数,Date()事实上就是相当于Date(System.cu ...

  10. Lesson 1 Basic Concepts: Part 2

    Getting your web site ‘live’ on the Web With the nerd background details under our belts, we can now ...