FMDB 二次封装,面向模型

最新针对 FMDatabaseQueue封装 如果你需要多线程处理数据库,用这个就轻松处理

一、FMDB简单介绍

FMDB是OC的方式封装了SQLite的C语言API,并且它对于多线程的并发操作进行了处理,所以是线程安全的;相对系统提供的CoreData,轻量好多,使用起来也很方便,除查询以外的所有操作,都称为“更新”,这里就不详细介绍了,不是本文的主题

二、为什么要再封装?

  • 1、隔离网络第三方框架,方便修改维护

  • 2、虽然FMDB已经封装了SQLite,但依然需要写SQL语句,对于模型中属性比较多的话,拼接SQL语句将变得十分繁琐;而且对于字符串、字典、数组数据是没办法直接存入数据库,需要特殊处理。

因此封装面向模型,只需要传入对应的模型信息就能进行数据库操作,不需要写任何SQL语句,屏蔽内部所有操作,插入什么模型,就取出什么模型,简单易用!同时为了保证传入的都是模型数据,添加了异常提示,对传入的模型做了限制,必须是NSObject或者NSObject的子类,同时不响应事件

  • 3、FMDB中操作执行异常只会打印出来(例如没有对应表的时候的操作),如果项目中打印信息比较多的话,不容易察觉。

因此操作异常时添加断言,准确定位操作异常位置以及异常情况

  • 4、对数据库操作后需要关闭数据库,此时增加了代码量,而且容易忘记,内存没办法及时释放。

因此将关闭数据库操作封装在框架中,此时调用不需要关心数据库的关闭

  • 5、面向模型开发,操作模型,更加面向对象,以前一般用数据库的时候一般都是直接保存后台返回的数据,此时每次取出来都要转一次模型,麻烦

三、API介绍(增删改查)

单例模式,项目中唯一,方便管理,传入数据库名称,后续操作不同的数据库

/**
 *  @author Clarence
 *
 *  单例创建,项目唯一
 */
+ (instancetype)shareManager:(NSString *)fl_dbName;

创表,外界传入指定的类,工具会根据类来创建表,如果此时表已经存在,则跳过,没有才去创建,执行完这个操作后自动关闭数据库,释放内存

#pragma mark -- 创表

/**
 *  @author Clarence
 *
 *  根据类名创建表,如果有则跳过,没有才创建,执行完毕后自动关闭数据库
 
 *  @return YES表示创建表格操作执行成功 或者 表格已经存在,NO则失败
 */
- (BOOL)fl_createTable:(Class)modelClass;

插入数据,可以传入单个模型,或者传入模型数组,此时内部处理了,遍历数组插入的期间数据库不会关闭,直到所有插入完毕后才关闭数据库;同时,如果传入的模型的FLDBID在对应表中已经存在,则执行更新操作,保证FLDBID对应数据的唯一性

#pragma mark -- 插入

/**
 *  @author Clarence
 *
 *  @param model 插入单个模型或者模型数组,如果此时传入的模型对应的FLDBID在表中已经存在,则替换更新旧的
 *  如果没创建表就自动先创建,表名为模型类名
 *  此时执行完毕后自动关闭数据库
 
 *  @return YES表示创建表格操作执行成功 或者 表格已经存在,NO则失败
 */
- (BOOL)fl_insertModel:(id)model;

查询 提供三个方法

  • 查询表是否存在,执行完毕就会自动关闭数据库,由于此方法存在,框架工具中会出现错误提示信息,因为如果没有对应表,执行操作语句FMDB就会打印出错误信息
  • 查找指定表中指定FLDBID的单个模型数据,执行完毕后自动关闭数据库,如果没有对应表,会有断言
  • 查找指定表中模型数组(所有的),执行完毕后自动关闭数据库,如果没有对应表,会有断言
#pragma mark -- 查询
/**
 *  @author Clarence
 *
 *  查询指定表是否存在,执行完毕后自动关闭数据库
 
 *  @return YES表示操作执行成功并且 modelClass 表格存在,NO则操作失败或者 modelClass 表格不存在
 */
- (BOOL)fl_isExitTable:(Class)modelClass;
/**
 *  @author Clarence
 *
 *  查找指定表中指定DBID的模型,执行完毕后自动关闭数据库
 
 *  @return 不等于nil,表示查询数据操作执行成功并有数据,返回查询成功的模型数据,nil则表示查询操作失败 或者 查询成功但数据为空 或者 对应的表格不存在
 */
- (id)fl_searchModel:(Class)modelClass byID:(NSString *)FLDBID;
/**
 *  @author Clarence
 *
 *  查找指定表中模型数组(所有的),执行完毕后自动关闭数据库
 
 *  @return 不等于nil,表示查询数据操作执行成功并有数据,返回查询成功的模型数据,nil则表示查询操作失败 或者 查询成功但数据为空 或者 对应的表格不存在
 */
- (NSArray *)fl_searchModelArr:(Class)modelClass;

修改 根据指定FLDBID,将新传入的模型替换旧的模型数据,执行完毕后自动关闭数据库,如果没有对应表,会有断言

#pragma mark -- 修改

/**
 *  @author Clarence
 *
 *  修改指定DBID的模型,执行完毕后自动关闭数据库
 
 *  @return YES表示更新操作执行成功,NO则操作失败 或者 对应的表格不存在
 */

- (BOOL)fl_modifyModel:(id)model byID:(NSString *)FLDBID;

删除,此时也提供了三个方法

  • 删除指定表,执行完毕后自动关闭数据库,如果没有对应表,会有断言
  • 删除指定表格的所有数据,执行完毕后自动关闭数据库,如果没有对应表,会有断言
  • 删除指定表中指定FLDBID的模型,执行完毕后自动关闭数据库,如果没有对应表,会有断言
  • 删除数据库
#pragma mark -- 删除
/**
 *  @author Clarence
 *
 *  删除指定表,执行完毕后自动关闭数据库
 
 *  @return YES表示删除操作执行成功,NO则操作失败 或者 对应的表格不存在
 */
- (BOOL)fl_dropTable:(Class)modelClass;
/**
 *  @author Clarence
 *
 *  删除指定表格的所有数据,执行完毕后自动关闭数据库
 
 *  @return YES表示删除操作执行成功,NO则操作失败 或者 对应的表格不存在 或者 没有对应数据可以删除
 */
- (BOOL)fl_deleteAllModel:(Class)modelClass;
/**
 *  @author Clarence
 *
 *  删除指定表中指定DBID的模型,执行完毕后自动关闭数据库
 
 *  @return YES表示删除操作执行成功,NO则操作失败 或者 对应的表格不存在 或者 没有对应数据可以删除
 */
- (BOOL)fl_deleteModel:(Class)modelClass byId:(NSString *)FLDBID;
/**
 *  @author gitKong
 *
 *  删除数据库
 
 *  @return 操作不涉及到数据库操作 YES 表示删除成功,NO则删除失败
 */
- (BOOL)fl_dropDB;

四、调用以及效果图(只举部分例子,详细请移步gitHub,有完整的Demo介绍)

 [FLFMDBMANAGER fl_insertModel:arrM];
[FLFMDBMANAGER fl_deleteModel:[FLStudentModel class] byId:model.FLDBID]
[[FLFMDBManager shareManager] fl_modifyModel:model byID:model.FLDBID]
[FLFMDBMANAGER fl_searchModel:[FLStudentModel class] byID:textField.text]
FMDB封装效果.gif

五、使用注意点

  • 单例模式,因此只能创建一个数据库,对于聊天账号的数据存储就可能不适用;最新已支持多数据,前往更新

  • 内部暂时使用FMDatabase这个类,线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题,后续会新增FMDatabaseQueue处理,线程安全;已新增针对 FMDatabaseQueue封装

  • 需要在模型中添加一个属性FLDBID,NSString类型,为了绑定对应的数据,从而进行增删改查操作
  • 需要插入数据库的模型不支持继承,因为根据类名来创建表,框架内部只能读取当前类的属性,其父类的属性没办法获取

  • 修改数据库中的模型数据只能通过指定的FLDBID作为条件修改

  • 暂时不支持模型属性动态删减,如果删了对应属性(除了FLDBID)不影响使用,但如果增加属性了,只能从新建表存储

  • 嵌套模型暂时不支持单表处理,需要创建多张表处理

六、小总结

  • 为了方便大家使用,提供了两个宏,创建数据库管理实例,其中如果是使用FLFMDBQUEUEMANAGER,就是使用默认的数据库,文件为gitkong.sqlite,使用FLFMDBQUEUEMANAGERX 传入名称,就会创建文件为 “名称”.sqlite 的数据库来使用

    #define FLDB_DEFAULT_NAME @"gitkong"
    

define FLFMDBMANAGER [FLFMDBManager shareManager:FLDB_DEFAULT_NAME]

define FLFMDBMANAGERX(DB_NAME) [FLFMDBManager shareManager:DB_NAME]


- *技术上实现并没多难,使用runtime就很容易获取当前模型类中的属性,关键还是处理一系列逻辑,代码比较简单,这里就不详细讲解了,Demo中有相对应的注释 !*

- *每个人都有自己的编程想法和爱好,有人喜欢面向字典开发、有人喜欢面向模型开发,我就喜欢面向模型封装,屏蔽内部处理逻辑,调用只需要一句代码,享受封装的过程~*

- *最后,还是那句,如果你有什么问题或者建议,尽管留言,欢迎大家关注我,喜欢就给个like 和 star,随时更新!谢谢支持!*

- ##[gitHub地址](https://github.com/gitkong/FLFMDBManager),欢迎star
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容