首先我们抛出来两个问题:1.什么是数据持久化数?2.据持久化都有哪些方法?接下来我们顺着思路,来解决这两个问题。
1.什么是数据持久化
从字面意思上理解,我们便知道,数据持久化是实现我们数据的长久储存,以便于我们在请求数据的时候能够更快速,更节省流量。从技术层面说,数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称. 数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。
换种说法:数据持久化就是将输入或网络请求的数据按照一定的方式存储在本地磁盘,并在需要时将磁盘中的数据按照特定方式取出显示在视图上的,可以将数据长期(永久)保存持有的行为。
2.数据持久化方法
实现数据持久化的方法各种各样,我们下面总结和举出几种常用和基础的数据持久化方式。
2.1、通过oc语言方式存储
存入:
首先,获取library路径,
其次,通过单例NSFileManager文件管理器创建文件并返回文件(数据所存入文件)路径
最后,通过writeToFile(例)方法将内容写入文件
取出:
首先,获取内容文件所在路径
然后,根据路径获取文件内容,并将内容显示(更新UI)
2.2、通过plist文件方式存储
存入:
首先,获取bundle路径,并在其中通过单例NSFileManager文件管理器创建plist文件,返回文件路径
其次,将数据放入字典或数组中通过writeToFile:(例)方法存入文件
取出:
首先,获取内容文件所在路径
然后,根据路径获取文件内容,并将内容显示(更新UI)
2.3、通过UserDefault方式存储
NSUserDefaults是单例,同时也是线程安全的。
常用在键值存储
NSUserDefaults类提供了一个与默认系统进行交互的编程接口。NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等。默认系统允许应用程序自定义它的行为去迎合用户的喜好。你可以在程序运行的时候从用户默认的数据库中读取程序的设置。同时NSUserDefaults的缓存避免了在每次读取数据时候都打开用户默认数据库的操作。可以通过调用synchronize方法来使内存中的缓存与用户默认系统进行同步。
NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL
存入:
获取NSUserDefaults单例对象,通过setObjiect: forKey:(例)方法存入文件,并通过synchronize方法实现数据同步
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:name forKey:@"kName"]; [defaults setBool:isOpen forKey:@"kIsOpen"];
return [defaults synchronize];//同步数据
取出:
同样获取单例对象,通过objectForKey:方法获取存储内容,并更新UI
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *name = [defaults objectForKey:@"kName"]; BOOL isOpen = [defaults boolForKey:@"kIsOpen"];
2.4、归档解档
一般用在自定义对象
前提,可创建模型并在模型中实现归档方法(将对象通过编码为二进制,NSCoder例方法:encodeObject:forKey:)和解档方法(将二进制文件通过编码成为数据对象,例方法:decodeObjectForKey:)
存入:(归档)
获取bundle路径,并在bundle中使用单例NSFileManager文件管理器创建存储文件并返回路径 然后,NSKeyedArchiver类利用带键的文件来归档,类方法archiveRootObject:toFile:
取出:(解档)
同样先获取文件路径,然后用NSKeyedUnarchiver类类方法(unarchiveObjectWithFile:)将数据取出,并更新UI
2.5、c语言SQLite3和FMDB
都采用单例方式,把行为进行封装
都是在单例的初始化的时候创建数据库对象,并且只执行一次创建
创建时,首先获取文件路径,再通过SQL语句创建数据库
在c语言中,一个完整的行为分为
1.打开数据库 sqlite3_open
2.编写sql语句
3.创建预编译对象(如果有参数,需要先绑定参数,例:插入,查询(部分),删除,更新) sqlite3_stmt *stmt(预编译对象)sqlite3_bind_text(绑定参数)
4.执行预编译对象 sqlite3_step(stmt);
5.销毁预编译对象 sqlite3_finalize(stmt);
6.关闭数据库 sqlite3_close(db)
FMDB对c语言中的数据库操作行为,所以操作更为简单和更易理解
常用在增删改查
FMDatabase 数据库对象类 用于执行SQL语句
FMRrsultSet 结果集合类 用于接受数据库队列执行后返回结果
FMDatabaseQueue 数据队列类 在多线程中更新的话需要用到该类
1.打开数据库 [db open];
2.编写sql语句
3.执行sql(数据库对象(FMDateBase实例)执行sql语句)
[db executeUpdate:sql];[(FMRrsultSet 实例) next]遍历
4.关闭数据库 [db close];