文/helloDolin(简书作者)
原文链接:http://www.jianshu.com/p/934a14e6de49
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOS下数据持久化常用的几种方式:

  • NSUserDefaults
  • plist(属性列表)
  • NSKeyedArchiver(对象归档)
  • iOS的嵌入式关系数据库SQLite3
  • 苹果公司提供的持久化工具 Core Data

上面几种方式,有一个共同的要素,就是应用的/Documents文件夹。每个应用都有自己的/Documents文件夹,且仅能读写各自/Documents文件中的内容


先让我们我们看看sandbox(沙盒)
将手机与电脑连接好之后,按如下步骤进行操作

步骤1

步骤2

步骤3


另一种方式

下载这个文件.png

下载这个文件我们会得到一个.xcappdata的文件

xcappdata.png

右键显示包内容

右键显示包内容

逐一打开你要的文件吧

沙盒目录结构清晰的展现在我们眼前

  • Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时 备份该目录。例如,游戏应用可将游戏存档保存在该目录
  • tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时 不会 备份该目录
  • Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时 不会 备份该目录。一般存储体积大、不需要备份的非重要数据
  • Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用 在该目录中查找应用的设置信息。iTunes同步设备时 备份该目录

NSUserDefaults:

直接上代码:

static NSString* const key = @"key";
[[NSUserDefaults standardUserDefaults] setValue:@"YES" forKey:key];
[NSUserDefaults standardUserDefaults] valueForKey:key]
[userDefaults removeObjectForKey:key];
[userDefaults synchronize];

上面的示例代码基本就是NSUserDefaults所有用法了,虽然很简单,但还是有几点需要注意:

  1. 建议将所有的的key单独存放(好处自己领会)
  2. NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储。之前碰到个坑就是从服务器拿到数据部分用这种方式存储,服务器返回NSNull,我们这边也没有model层转,就直接存储了,导致app卡掉但并没有闪退之类,就是线程卡死的情况
  3. 同步问题,在适当的时候同步。因为synchronize的开销可能会很大,因为要比较内存中和存储中的所有用户偏好默认值,如果有好几百个key value 同步是非常消耗性能的。
  4. 偏好设置是专门用来保存应用程序的配置信息的,( 用过Settings.bundle的应该都很熟悉),所以一般不要在偏好设置中保存其他数据。
  5. 偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。

plist(属性列表):

首先需要知道什么是序列化对象(serialized object):指可以被转换为字节流以便于存储到文件中或通过网络进行传输的对象

可以被序列化的类型只有如下几种:
NSArray
NSMutableArray
NSDictionary
NSMutableDictionary
NSData
NSMutableData
NSString
NSMutableString
NSNumber
NSDate

还是直接上代码示例

/***  获取存储路径*/
- (NSString*)dataFilePath {NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *documentDirectory = paths[0];return [documentDirectory stringByAppendingPathComponent:@"data.plist"];//nsstring真强大
}

我们在app处于非活跃状态时存储一些东东

UIApplication* app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];- (void)appWillResignActive:(NSNotification*)notification {NSString* filePath = [self dataFilePath];NSArray* arr = @[@1,@2,@3,@4];[arr writeToFile:filePath atomically:YES];
}

在我们需要这些东东的时候从文件中读取

NSString* filePath = [self dataFilePath];
if ([[NSFileManager defaultManager]fileExistsAtPath:filePath]) {NSArray* arr = [[NSArray alloc]initWithContentsOfFile:filePath];
}

NSKeyedArchiver(对象归档):

在Cocoa中,Archiver是另一种形式的序列化,是任何对象都可实现的更常规的类型

说明:

  1. 只有遵守了NSCoding或 NSSecureCoding(更为安全的归档协议)协议,并且实现了协议里归档与解归档的方法的的类创建的对象才能够进行归档
  2. 最好也实现以下NSCopying,NSCopying与NSCoding一起实现好处在于允许复制对象,使用数据模型对象时有较大的灵活性

还是直接上代码

#import <Foundation/Foundation.h>
@interface FourLines : NSObject<NSCoding,NSCopying>@property(copy,nonatomic)NSArray* lines;@end#import "FourLines.h"//编解码的key
static NSString* const klinesKey = @"klinesKey";@implementation FourLines#pragma mark -  NSCoding- (void)encodeWithCoder:(NSCoder *)aCoder {[aCoder encodeObject:self.lines forKey:klinesKey];
}- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder {self = [super init];if (self) {self.lines = [aDecoder decodeObjectForKey:klinesKey];}return self;
}#pragma mark -  NSCopying - (id)copyWithZone:(nullable NSZone *)zone {FourLines* copy = [[[self class]allocWithZone:zone]init];NSMutableArray* linesCopy = [NSMutableArray array];for (id line in self.lines) {[linesCopy addObject:[line copyWithZone:zone]];}copy.lines = linesCopy;return copy;
}@end

写入数据,编码:文件路径还是用上面代码中定义的文件路径

- (void)appWillResignActive:(NSNotification*)notification {NSString* filePath = [self dataFilePath];FourLines* lines = [[FourLines alloc]init];lines.lines = @[@"a",@"b",@"c",@"d"];NSMutableData* data = [[NSMutableData alloc]init];NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];[archiver encodeObject:lines forKey:kRootKey];[archiver finishEncoding];[data writeToFile:filePath atomically:YES];
}

读取数据,解码:

NSString* filePath = [self dataFilePath];if ([[NSFileManager defaultManager]fileExistsAtPath:filePath]) {NSData* data = [[NSMutableData alloc]initWithContentsOfFile:filePath];NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];FourLines* four = [unarchiver decodeObjectForKey:kRootKey];[unarchiver finishDecoding];for (int i = 0; i < 4; i++) {//to do}
}UIApplication* app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];

iOS的嵌入式关系数据库SQLite3 :

这里跳过SQLite3,直接上FMDB
简介

FMDB是iOS平台的SQLite数据库框架,它是以OC的方式封装了SQLite的C语言API,它相对于cocoa自带的C语言框架有如下的优点:
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
对比苹果自带的Core Data框架,更加轻量级和灵活
提供了多线程安全的数据库操作方法,有效地防止数据混乱
注:FMDB的gitHub地址

本文不进行详解


苹果公司提供的持久化工具 Core Data:

这里主要说明以下谓词的概念:类似SQL的where定义条件
在创建项目的时候

注意勾选此处

具体使用不进行详解


希望能给大家带来帮助O(∩_∩)O

著作权归作者所有

iOS中几种数据持久化方案-转自简书相关推荐

  1. iOS中几种数据持久化方案总结

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  2. ios realm 文件_iOS数据持久化方案-Realm的使用

    总体内容 1.Realm介绍 2.使用教程与辅助工具 3.Realm的具体使用 一.Realm介绍 1.1.Realm 是一个跨平台移动数据库引擎,支持iOS.OS X(Objective-C和Swi ...

  3. iOS数据持久化方案

    技术由来 数据持久化是iOS开发中必不可少的一项技能.因为开发中我们多会涉及到用户信息存储.文件存储.应用内容缓存中的一个或者几个场景. 数据持久化的几种方式 NSUserDefaults plist ...

  4. iOS应用架构谈-本地持久化方案及动态部署

    iOS应用架构谈-开篇 iOS应用架构谈-view层的组织和调用方案 iOS应用架构谈-网络层设计方案 iOS应用架构谈-本地持久化方案及动态部署 iOS应用架构谈-组件化方案 前言 嗯,你们要的大招 ...

  5. 四种数据持久化方式(上) :属性列表与归档解档

    iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹. iOS开发中 ...

  6. Unity(游戏)中五种数据存储的方法

    Unity(游戏)中五种数据存储的方法 一.PlayerPrefs unity3d提供了一个用于本地持久化保存与读取的类-------PlayerPrefs.工作原理很简单,以键值对的形式将数据保存在 ...

  7. avg最多用多少列 mysql_MySQL_MySQL中几种数据统计查询的基本使用教程,统计平均数 SELECT AVG() FROM 语 - phpStudy...

    MySQL中几种数据统计查询的基本使用教程 统计平均数SELECT AVG() FROM 语法用于从数据表中统计数据平均数. 语法: SELECT AVG(column) FROM tb_name 该 ...

  8. iOS中常用的四种数据持久化方法

    iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults s ...

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

    IOS有四种经常使用数据存储方式: 第一种方法:用NSUserDefaults存储配置信息 NSUserDefaults被设计用来存储设备和应用的配置信息.它通过一个工厂方法返回默认的.也是最经常使用 ...

最新文章

  1. pandas的series和dataframe
  2. 关于align=absmiddle的说明
  3. UVA 10976 - Fractions Again?!
  4. 呼和浩特 计算机编程入门先学什么,学好UG编程先学什么?应该先弄懂这些问题...
  5. Oozie JMS通知消息实现--根据作业ID来过滤消息
  6. 在RHEL6.2上,将一个分区开机自动挂载
  7. 异构服务器 微服务_Spring Cloud Alibaba Sidecar 多语言微服务异构
  8. apriori算法c++_关联分析——基于Apriori算法实现
  9. python网络编程---TCP服务器
  10. 销售到出仓所经历的表
  11. Node.js webpack 加载器
  12. CSS 的导入方式 (link or import ?)
  13. 关于XIFF开发IM的一些想法
  14. 一天干掉一只Monkey计划(一)——基本光照模型及RT后处理 【转】
  15. 浏览器怎么置顶_Windows 10 窗口置顶 bug 解决方案汇总
  16. Java用POI导出Excel表格中的数据
  17. quicktime不能成功安装
  18. 如何提高游戏中的打击感?
  19. 钢条切割问题(自顶向下)
  20. 学会生命倒计时法,就是精彩生活的开始

热门文章

  1. ndk开发字符串转十六进制!音视频时代你还不会NDK开发?已拿offer
  2. ssm练习第二天_项目拆分moudle_基本增删改查_批量删除_一对一级联查询
  3. 幸运转盘中的芯片——CD4017和NE555
  4. 【swagger2】Spring Boot 配置swagger2
  5. 数据管理-数据质量检测
  6. 利用ACM服务,快速申请免费的公有证书,你get到了吗?
  7. vue 使用echarts实现3D饼图和环形图
  8. Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):定义主页面
  9. 源生js封装ajax
  10. 2023最火批量getshell工具