iOS数据持久化

Title: iOS数据持久化

##数据持久化概念

数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

##数据持久化的好处

1. 程序代码重用性强,即使更换数据库,只需要更改配置文件,不必重写程序代码。

2. 业务逻辑代码可读性强,在代码中不会有大量的SQL语言,提高程序的可读性。

3. 持久化技术可以自动优化,以减少对数据库的访问量,提高程序运行效率。

##iOS数据持久化方案

- NSUserDefault

- 文件存储 (包括:Plist属性列表、archive 归档、文件流)

- 钥匙串(keychain)

- 数据库相关 (Core Data、SQLite 3)

###沙盒机制

在iOS中每个APP都拥有自己的**沙盒**,APP**只能访问**对应沙盒中存储的数据, iOS是**不允许**跨越沙盒去访问数据的,所有的数据都是保存在该沙盒的三个子目录下。

###沙盒目录结构

```

应用程序.ipa

Documents

Library

\Caches

\Preferences

Temp

```

- `应用程序包`: 这里存放的是应用程序的源文件,包括资源文件和可执行文件。

```

NSString *ApplicationPath = [[NSBundle mainBundle] bundlePath];

```

- `Document`: 一般在该目录下保存一些比较重要的数据,当连接 iTunes后会自动同步数据。

```

NSString *DocumentPath = [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES).firstObject];

```

`PS:  如果将数据资源保存到该目录.上架可能会被拒绝,(解决方案:直接设置该文件夹不被iTunes备份),总之:不能保存从网上下载的数据,否则不能上架。`

- `Library`: 存储应用设置或者状态信息等,在该目录下还有两个子目录: `Caches和Preference`

```

NSString *CachesPath =  [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject];

```

`Library/Caches`: 存放缓存文件,iTunes不会备份,因此文件不会因APP退出而删除(一般使用SDWebImage的缓存资源都是保存到这来)

`Library/Preference`: 保存应用的所有偏好设置,iOS的Setting(设置)会在该目录查找该应用的设置信息,iTunes会同步数据

- temp: 临时文件, iTunes不会备份该文件夹中的数据, 这个文件夹中的数据,会因为应用的关闭而删除。

```

NSString *tempPath = NSTemporaryDirectory( );

```

###NSUerDefault

小规模数据,弱业务相关数据,都可以放到`NSUserDefault`里面。

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

- 如果没有调用`synchronize`方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用`synchronize`方法。

- 偏好设置会将所有数据保存到同一个文件中。即`preference`目录下的一个以此应用包名来命名的plist文件。

```

//1.获得NSUserDefaults文件

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

//2.向文件中写入内容

[userDefaults setObject:@"Barry" forKey:@"name"];

[userDefaults setBool:YES forKey:@"male"];

[userDefaults setInteger:20 forKey:@"age"];

//2.1立即同步

[userDefaults synchronize];

//3.读取文件

NSString *name = [userDefaults objectForKey:@"name"];

BOOL male = [userDefaults boolForKey:@"male"];

NSInteger age = [userDefaults integerForKey:@"age"];

NSLog(@"%@, %d, %ld", name, male, age);

```

###Plist

`plist文件存储`:是一种明文的轻量级存储方式,最常用的格式是XML格式,系统会提供一个info.plist文件,这种方式的安全性几乎为**0**,所以`plist`主要是用于存储少量并且不重要的数据。 `plist`只能读取数组(NSArray)或者字典(NSDictonary)。

```

/**

*  Plist文件

*/

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

NSString *fileName = [path stringByAppendingPathComponent:@"Person.plist"];

NSDictionary *dict = @{

@"name" : @"Barry",

@"age" : @20,

@"height" : @1.80f

};

// 将数据写入Plist

[dict writeToFile:fileName atomically:YES];

NSLog(@"%@", fileName);

// 读取plist中的数据

NSDictionary *dicts = [NSDictionary dictionaryWithContentsOfFile:fileName];

NSLog(@"dict = %@",dicts);

NSString *str = [NSString stringWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:nil];

NSLog(@"str = %@", str);

```

###Keychain(钥匙串)

`Keychain` 是苹果提供的带有可逆加密的存储机制,普遍用在各种存密码的需求上。另外,由于App卸载只要系统不重装,`Keychain`中的数据依旧能够得到保留,以及可被`iCloud`同步的特性,大家都会在这里存储用户唯一标识串。所以有需要加密、需要存`iCloud`的敏感小数据,一般都会放在`Keychain`。

###数据归档/序列化(NSKeyedArchiver)

`NSKeyedArchiver`: 是一种轻量级存储的持久化方案,数据化归档时经过加密处理的,所以安全性远高于`plist`。数据归档可以存储一些复杂的对象,数据保存前会经过二进制处理。

- 遵循协议、设置属性

```

/*遵循 NSCoding 协议*/

@interface Student : NSObject

/*设置属性*/

@property(nonatomic, copy) NSString *name;

@property(nonatomic, assign) int age;

@property(nonatomic, copy) NSString *gender;

@end

```

```

/*解档(反序列化)*/

- (instancetype)initWithCoder:(NSCoder *)aDecoder {

if (self == [super init]) {

self.name = [aDecoder decodeObjectForKey:@"name"];

self.age = [aDecoder decodeIntForKey:@"age"];

self.gender = [aDecoder decodeObjectForKey:@"gender"];

}

return self;

}

/**归档(序列化)*/

- (void)encodeWithCoder:(NSCoder *)aCoder {

// 归档姓名(字符串对象)

[aCoder encodeObject:self.name forKey:@"name"];

// 归档年龄(注意:这是基本数据类型, 如果是其他的类型,直接调用对应类型的encode即可)

[aCoder encodeInteger:self.age forKey:@"age"];

[aCoder encodeObject:self.gender forKey:@"gender"];

}

@end

```

PS:

1. 必须遵循并实现NSCoding协议

2. 保存文件的扩展名可以任意指定

3. 继承时必须先调用父类的归档解档方法

###数据库(SQLite)

数据库(SQLite3): 是一个轻量级,跨平台的小型数据库,可移植性比较高,有着和`MySql`几乎相同的数据库语句,以及无需服务器即可使用的优点。

数据库的优点:

-  该方案可以存储大量的数据,存储和检索的速度非常快。

- 能对数据进行大量的聚合,这样比起使用对象来讲操作要快。

数据库的缺点:

- 它没有提供数据库的创建方式。

- 它的底层是基于C语言框架设计的,没有面向对象的API,用起来非常麻烦。

- 发杂的数据模型的数据建表,非常麻烦。

在实际开发中我们都是使用的是`FMDB`第三方开源的数据库,该数据库是基于`splite`封装的面向对象的框架。

###CoreData

`coreData`: 是苹果官方在iOS5之后推出的综合性数据库,其使用了对象关系映射技术,将对象转换成数据,将数据存储在本地的数据库中。

` coreData`为了提高效率,需要将数据存储在不同的数据库中,比如:在使用的时候,最好是将本地的数据保存到内存中,这样的目的是访问

速度比较快。

PS: CoreData并不是数据库!

使用了对象关系映射技术,将对象转换成数据,将数据存储在本地的数据库中。底层还是使用 SQLit3。

##下面一篇BLOG,将着重介绍第三方封装数据库`FMDB`的使用!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 前言: 在程序开发中,数据层永远是程序的核心结构之一。对这些数据的加工处理是代码中能体现技术水平的一大模块,比如数...
    麦穗0615阅读 1,453评论 3 22
  • 概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。在iOS开发中,...
    HWenj阅读 568评论 0 8
  • 1.CoreData 1.1 CoreData概述 1)Core data 是数据持久存储的最佳方式 2)Core...
    微春风阅读 3,792评论 0 10
  • 1.简介 数据持久存储是一种非易失性存储,在重启动计算机或设备后也不会丢失数据。持久化技术主要用于MVC模型中的m...
    公子无礼阅读 1,671评论 0 4
  • IOS数据持久化 数据的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。在i...
    koula阅读 1,154评论 0 19