iOS 几种数据持久化方案 – swift 3.0

概论

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

plist文件(属性列表)

preference(偏好设置)

NSKeyedArchiver(归档)

SQLite

CoreData

**************************************************************************

沙盒

在介绍各种存储方法之前,有必要说明以下沙盒机制。iOS程序默认情况下只能访问程序自己的目录,这个目录被称为“沙盒”。

1.结构

沙盒就是一个文件夹,看里面有什么呢。沙盒的目录结构如下:

MyApp.app - "应用程序包"
Documents
Library
Caches
Preferences
tmp

2.目录特性

虽然沙盒中有这么多文件夹,但是没有文件夹都不尽相同,都有各自的特性。所以在选择存放目录时,一定要认真选择适合的目录。

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


Documents: 最常用的目录,iTunes同步该应用时会同步此文件夹中的内容,适合存储重要数据。

Library/Caches: iTunes不会同步此文件夹,适合存储体积大,不需要备份的非重要数据。

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

tmp: iTunes不会同步此文件夹,系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除。

 

plist

plist文件是将某些特定的类,通过XML文件的方式保存在目录中。

可以被序列化的类型只有如下几种:

NSArray;
NSMutableArray;
NSDictionary;
NSMutableDictionary;
NSData;
NSMutableData;
NSString;
NSMutableString;
NSNumber;
NSDate;

注意

只有以上列出的类型才能使用plist文件存储。

存储时使用write : atomically:方法。 其中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写true。

写入时会自动创建plist文件

读取时使用NSArray(contentsOfFile:)方法。


缺点:项目中的plist文件一般作为固态的数据形势保存,对于经常需要改动的数据就不方便了
只能存储含有 write(ToFile:)方法的对象,如NSDictionary,NSArray等.

 

Preference

1.使用方法

2.注意

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

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

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

NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储

缺点 : 本质还是plist文件存储,相对于plist文件存储来讲存储数据更快捷.

 

NSKeyedArchiver

归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于决大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。

1.遵循NSCoding协议

NSCoding协议声明了两个方法,这两个方法都是必须实现的。一个用来说明如何将对象编码到归档中,另一个说明如何进行解档来获取一个新对象。

遵循协议和设置属性

例子详见官网示例 FoodTrackPersist Data >>

注意

必须遵循并实现NSCoding协议

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

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

自定义对象可以用归档操作保存。

缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。

 

SQLite

之前的所有存储方法,都是覆盖存储。如果想要增加一条数据就必须把整个文件读出来,然后修改数据后再把整个内容覆盖写入文件。所以它们都不适合存储大量的内容。

1.字段类型

表面上SQLite将数据分为以下几种类型:

integer : 整数

real : 实数(浮点数)

text : 文本字符串

blob : 二进制数据,比如文件,图片之类的

实际上SQLite是无类型的。即不管你在创表时指定的字段类型是什么,存储是依然可以存储任意类型的数据。而且在创表时也可以不指定字段类型。SQLite之所以什么类型就是为了良好的编程规范和方便开发人员交流,所以平时在使用时最好设置正确的字段类型!主键必须设置成integer

2. 准备工作

2.1下载SQLiteManager for Mac,创建数据库data.db

2.2 寻找操作SQLite数据库类的封装文件,源文件是C语言,不好用

封装库可以大大方便对数据库、表的操作

封装库下载地址:https://github.com/fahimf/sqlitedb

2.3 新建项目SQLite-1

2.4 在项目属性页  Build Phases -> Link Binary With Libraries中点击加号, 添加 libsqlite3.0.tdb 到项目中来

2.5 在 Build Phases -> Copy Bundle Resources 中点击加号,添 加 data.db 到项目中来

2.6 在项目中创建连接头文件 Bridging-Header.h

写入 #import "sqlite3.h"  #import<time.h>

2.7 在项目编译属性中引用此头文件

2.8 引入下载的SQLite操作类

SQLiteDB.swift、SQLTable.swift和String-Extras.swift

3.使用

3.1 建表

3.2 读取和写入

数据库位置

查看数据:

4.总结

总得来说,在一般开发过程中,使用的都是第三方开源库,封装了这些基本的c语言方法,使得我们在使用时更加容易理解,提高开发效率。

 

CoreData

Core Data是iOS5之后才出现的一个框架,是iOS集成的

Core Data提供了对象-关系映射(ORM)的功能,即能够将OC对象转 化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的 数据还原成OC对象。

在数据操作期间,不需要编写任何SQL语句,有点类似于著名的 hibernate持久化框架,不过功能没有Hibernate强大

使用

1、新建工程,注意勾选 Use Core Data

2、添加实例 Person: name(string), age(Int64)

3、ViewController.swift顶部加上:

import UIKit

import CoreData

import Foundation

4、读取与写入代码

按键事件:

获取context

读取:

写入:

查看数据库:

 


Comments are closed.