关闭

iOS中的数据持久化

标签: ios
123人阅读 评论(0) 收藏 举报
分类:

本文由我们团队的王瑞华童鞋撰写。


数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。 数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。在iOS开发中,有很多种数据持久化方案,本文主要介绍 plist文件,NSKeyedArchiver,SQLite3,NSUserDefaults。

iOS的沙盒模型

iOS最为人所熟知的就是其沙盒模型,一个App的读写权限只限于自己的沙盒目录中。沙盒模型的好处有哪些?1. 安全,别的app无法修改你的程序。2. 保护隐私,别人app无法读取你的程序。3.便于系统管理,一个app产生的内容都包含在自己的沙盒中,便于系统管理。
iOS 沙盒目录结构如下

如果我们想获取上面某个目录的路径,应该如何实现呢?

对于最常用的Documents目录,iTunes同步该应用时会同步该文件夹内容,适合存放用户重要数据

Library/Caches:iTunes不会同步该文件夹

Library/Preferences: iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息。

tmp:此目录适合保存应用中的一些临时文件,用完就删除。

NSFileManager

在实际项目开发中,我们一般会创建一个工具类来对app的文件进行管理。
NSFileManager 提供一个类方法获得一个单例。

下面是NSFileManager的常用方法

plist 文件

plist文件的实质为XML文件,很容易查看到文件数据类型。可以被plist文件序列话的类型只有以下几种:

  • NSArray, NSMutableArray
  • NSDictionary, NSMutableDictionary
  • NSData, NSMutableData
  • NSString, NSMutableString
  • NSNumber
  • NSDate

而在实际的项目中,我们一般是将NSDictionary或NSArray的对象保存到文件或者从文件读取成对象。NSDictionary和NSArray会直接写成plist文件。

序列化可以通过两种途径来进行

  • 使用数据对象自带方法
  • 使用NSPropertyListSerialization类

    UserDefault

    顾名思义,它就是一个用户的一些偏好设置。对于该部分,每一个app都要一个plist文件专门保存偏好设置数据。 plist文件名默认是程序Bundle identifier,扩展名为plist。除了程序自己的设置外,系统还有一些全局的或者其它的一些设置,也属于User Defaults的范畴,User Defaults的持久化数据都保存在 ~/Library/Preferences 目录中。NSUserDefaults 类来读写Preferences设置,而无需考虑文件位置等细节问题。NSUserDefaults 用起来和 NSDictionary 很相似,多了一个Domain的概念在里面。

    NSKeyedArchiver 归档

    归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。

    遵从NSCoding协议
    NSCoding 协议声明了两个方法,这两个方法都是必须实现的。一个用于归档,一个用于解档。

    SQLite3

    由于本人对于数据库的操作一直采用FMDB库进行操作,一下就已该库操作为例。
    SQLite是无类型的。即不管你在创表时指定的字段类型是什么,存储是依然可以存储任意类型的数据。但为了良好的编程规范和增加可读性,一般都指定类型。一般分为:

    • integer : 整数 主键必须设置为该类型
    • real : 实数(浮点数)
    • text : 文本字符串
    • blob : 二进制数据,比如文件,图片之类的

      FMDB

      FMDB是iOS平台的SQLite数据库框架,FMDB以OC的方式封装了SQLite的C语言API。具有一下有点

    • 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
    • 对比苹果自带的Core Data框架,更加轻量级和灵活
    • 提供了多线程安全的数据库操作方法,有效地防止数据混乱

    核心类包括FMDatabase, FMResultSet, FMDatabaseQueue这三个类。

    对于数据库操作,谈论比较多的就是线程安全问题。不要让多个线程操作同一个库。为此,FMDB实现了一个FMDatabaseQueue类,以保证数据库的线程安全。

    以上内容为本人根据工作中涉及的知识点整理内容,如有侵权请与我联系。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

iOS之数据加密

常用术语 密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数.(密钥分为对称密钥和非对称密钥,也可以根据途径分为加密密钥和解密密钥) 明文:没有进行加密,能够直接代表原文含义的信息 密文:经过加密处理之后,隐藏原文含义的信息 加密:将明文转换成密文的实施过程 解密:将密文转换成...
  • u010390827
  • u010390827
  • 2016-05-06 21:57
  • 581

iOS开发mock接口数据(三)之实战教程

接上篇文章,我对一些匹配的方法进行了介绍,这篇文章主要为大家说说实际操作的步骤。plist文件如何配置  plist文件的配置对于APIMock的至关重要,直接关系到能否运用AOP编程思想实现JKAPIMock所要达到的目标。如下图: 这里主要针对GET,POST请求做了处理,如果某个接口不需...
  • HHL110120
  • HHL110120
  • 2017-03-13 12:59
  • 2083

iOS开发mock接口数据(一)之需求分析

在大团队开发的过程中,很多时候后台往往先定义好接口文档,然后后台去开发接口,前端开发app。并行开发,提高开发效率。下面给大家分享一下我们团队中使用的mock机制mock数据有两种方式, 一种是后台建立mock数据服务器,另一种是app开发者,在项目中自己维护。目前我们采用的是放在自己的项目中来维护...
  • HHL110120
  • HHL110120
  • 2017-03-10 21:01
  • 1468

iOS之数据的存储(数据持久化)

所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。其实储存的形式无非就这么几种,而我们还必须要关心的是,这些文件会被放置在那个文件下,然后如何读取。 也就是说:IOS上数据存储,我们要了解的两点,数据存储格式(也就是存储机制),数据存储位置。 数据存...
  • Zhi_Sheng
  • Zhi_Sheng
  • 2016-04-28 16:51
  • 1649

数据驱动与ReactiveCocoa iOS开发

数据驱动与ReactiveCocoa iOS开发 作者:  霍华德蔓生 推特 编者按:这篇文章是由 霍华德蔓生 和 马特·马赛厄斯 。 ReactiveCocoa (RAC)是一个...
  • PoLuoGuiZu
  • PoLuoGuiZu
  • 2014-02-10 15:29
  • 3222

iOS- 利用AFNetworking去管理从聚合数据上面请求到的数据

利用AFNetworking框架去管理从聚合数据上面请求到的数据 数据从JSON文档中读取处理的过程称为“解码”过程,即解析和读取过程,来看一下如果利用AFNetworking框架去管理从聚合数据上面请求到的数据。 一、下载并导入AFNetworking框架 这部分内容如果不了...
  • xiaohe901216
  • xiaohe901216
  • 2016-08-12 09:20
  • 518

iOS中常用的四种数据持久化方法简介

OS中的数据持久化方式,基本上有以下四种:属性列表、对象归档、SQLite3和Core Data 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults standardUserDefaults]就够用了 @interface User : NSObj...
  • leikezhu1981
  • leikezhu1981
  • 2014-03-24 23:10
  • 8597

IOS开发中必须熟练掌握的数据存储方式

1、iOS应用数据存储的常用方式1、XML属性列表(plist)归档plist文件只能归档(存储)字典和数组,字典和数组里面保存的数据必须是 Boolean,Data,Date,Number,String 这几种系统自带的对象类型。 不能存储自定义的对象。 2、Preference(偏好设置)P...
  • zhuohong_xiao
  • zhuohong_xiao
  • 2015-04-23 14:12
  • 1466

IOS开发造假数据简单实例应用

本实例是用UITableView显示,使用MVC编程模式开发 首先创建Model //  KTVModel.h #import @interface KTVModel : NSObject @property(nonatomic, strong) NSStri...
  • liuzhihui666
  • liuzhihui666
  • 2017-04-12 23:44
  • 675

iOS数据下载及本地数据库缓存策略

在移动开发中,数据的下载与缓存是常见的需求。由于需要根据网络状态读取服务器或本地资源,这就涉及到请求与缓存的策略问题。 下面以新闻的下载与缓存为例,需求是用户打开应用从服务器分页加载最新新闻,如果没有网络,则读取本地缓存的新闻。 我的开发思路如下: 1.进入页面优先发送请求,读取最新文章列表。 2....
  • WorthyZhang
  • WorthyZhang
  • 2015-03-19 11:20
  • 2215
    个人资料
    • 访问:33723次
    • 积分:509
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:78篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论