数据库作为App缓存设计的首选,存在一些开发的陷阱,同时需要考虑性能、开发效率和可维护性,笔者建议自行搭建数据库管理类,同时配合成熟的开源ORM框架快速搭建数据库模块。
本示例采用fmdb框架 https://github.com/ccgus/fmdb
SQLite多线程访问问题分析:
|
|
- 调用testfmdb方法抛出异常:The FMDatabase is currently in use.
- ios中SQLite同Android中SQLite一样,数据库不支持多线程读写并发访问,Android底层对SQLite单个数据库连接读写操作做了同步处理,也仅能支持单数据库连接的并发访问。
SQLite多线程访问解决方案:
使用fmdb FMDatabaseQueue
- FMDatabaseQueue对所有数据库访问都在串行同步队列中执行,规避并发问题的产生;
- 所有数据库的操作,通过调用 inDatabase 在block回调中通过db访问数据库,block代码在当前线程中执行。
|
|
配合fmdb快速搭建ORM:
- 定义DAO基类ZZBaseDAO;
|
|
- ZZBaseDAO实现类,通过调用NSObject的
setValuesForKeysWithDictionary和valueForKey实现NSDictionary和entity对象间转换;
|
|
- fmdb数据库操作ORM实例:
|
|
- 处理数据库中特殊字段如id等与oc关键字冲突的情况:
定义函数setValue:forUndefinedKey,实现特殊数据库字段与entity中property的映射。
|
|
- 使用fmdb升级数据库:
通过判断表中字段是否存在来确定是否需要升级
|
|