FMDB 二次封装,面向模型

作者: gitKong | 来源:发表于2016-11-21 17:24 被阅读2784次

最新针对 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

相关文章

  • FMDB 再封装,多线程安全

    一、前言 继之前封装的 FMDB 二次封装,面向模型 ,由于需要多线程操作数据库,之前是针对 FMDatabase...

  • FMDB 二次封装,面向模型

    最新针对 FMDatabaseQueue封装 如果你需要多线程处理数据库,用这个就轻松处理 一、FMDB简单介绍 ...

  • OC-FMDB二次封装(面向模型开发)

    主要实现逻辑 通过继承HWFMDBModel,在操作数据库时,内部通过runtime获取模型的属性列表,通过手动拼...

  • SYCacheManager缓存数据操作

    SYCacheManager使用FMDB、LKDB进行二次封装,缓存数据。 FMDB的基本使用使用FMDataba...

  • iOS FMDB使用与缓存数据

    一、FMDB简介 什么是FMDBFMDB是iOS平台的SQLite数据库 框架FMDB以面向OC的方式封装了SQL...

  • 对FMDB面向对象封装

    LKFMDB Demo下载地址 gitHub最好是在github上看上面有详细介绍,不断更新修改问题。对FMDB面...

  • iOS中FMDB的增、删、改、查

    FMDB 是对SQlite的封装,面向对象FMDatabase: 用来执行(增、删、改、查)的SQL语句FMRes...

  • FMDB二次封装

    转自:csdn博客链接 再封装目的狠明确,就是用的时候更好用。 其实说白了,数据库从大了来说就是增删改查,而我们在...

  • 数据库操作

    数据库操作(FMDB的二次封装) 项目地址 https://github.com/pkgogai/GYDFound...

  • 搞搞FMDB

    一、介绍 FMDB是一种第三方的开源库,FMDB就是对SQLite的API进行了封装,加上了面向对象的思想,让我们...

网友评论

  • 何颀:FLFMDBManager * manage = [FLFMDBManager shareManager:@“DB_DownLoadDataBase”];
    BOOL ret = [manage fl_insertModel:downVedio];
    ret 一直为No是为什么
  • SoaringHeart:支持模型嵌套吗?
  • SoaringHeart:如果需求如下:有多个老师和多个学生,多对多的关系,能生成第三张关联表吗?
  • SoaringHeart:FMDatabaseQueue 真的有必要手动open与close吗?
  • SoaringHeart:void FLDISPATCH_ASYNC_GLOBAL(void(^block)()){
    dispatch_async(dispatch_get_global_queue(0, 0), block);
    }
    这种声明方式有具体的名称吗?能具体解释下吗?
    gitKong:@蓝梦星魂 没啥具体名称,就一个C函数
  • STF_ZHANG:你好,不支持pod是吧。。。
    gitKong:@STF_ZHANG 不行
    STF_ZHANG:@gitKong 如果我需要根据一个ID查出多个model,可以实现吗
    gitKong:暂不支持喔
  • Andy_WangPeng:用事务了吗?数据很多。字段很多,耗费时间嘛
    5d04a77d78d0:不好意思,是我本地缓存问题,已解决,谢谢
    5d04a77d78d0:你好,我用了一下你的杰作,创建表成功了,但插入数据时提示The FMDatabase is not open不清楚是什么原因导致的,期待您的解答
    gitKong:@Andy_WangPeng 有
  • WeiHing:FMDatabaseQueue 的inDatabase:方法中已经调用了dataBase的open方法,为什么在多个读写方法中还要判断[db open]?求解答~
    gitKong:@WeiHing 防止外界异常操作关闭了数据库
  • 疯狂的强子:呼叫版主,为啥我创建的表格不能保存,再次打开会直接重新创建啊
    gitKong:@疯狂的强子 我刚看了下,我的Demo是可以喔,你怎么操作的
    疯狂的强子:@gitKong 对的
    gitKong:@疯狂的强子 用哪个库的?线程安全那个?
  • Chefil:这样封装当model属性为nadata的时候,会出现语法错误,解决的办法是数据库语句不要使用stringWithFormat
    gitKong:@Chefil 哦哦,这样子!回头试试
  • 夏趣意转秋来:有几个问题想问下:
    1、[model isKindOfClass:[NSArray class]] || [model isKindOfClass:[NSMutableArray class]]
    NSMutableArray继承NSArray 这么写是不是重复了?
    2、#define FLCURRENTDBQUEUE (FMDatabaseQueue *)self.queueDictM[self.dbName] 把实例对象定义成宏 这样合适么
    3、 __weak typeof(self) weakSelf = self;
    FLDISPATCH_ASYNC_GLOBAL(^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    这里应该没有循环引用吧 没必要weakself了吧
    gitKong:@夏趣意转秋来 1、虽然mutable是派生类,但是类型判断完善是必须的,这里我应该要先判断派生类,然后再父类。2、把实例对象定义宏没毛病,宏只是替换而已,不复杂计算就好。3、是没有循环引用,只是个人编程习惯
  • First灬DKS:博主很热心!赞一个!!!
  • flightlessBirdT:博主人很好 耐心解答技术问题
    gitKong:@flightlessBirdT 谢谢支持:blush:
  • 尕宝11:FLDBID的名字要怎么起啊?感觉这个属性有点别扭,大家是怎么起的
    gitKong:@尕宝11 这个名字是绑定我这个工具的喔
    尕宝11:@gitKong Demo我看过了,想问一下,这个模型的标识FLFMID有没有可能放在工具里面来做?
    gitKong:可以看我demo喔
  • 谈Xx:模型类不需要继承么,那侵入性比较低。 所以需要传类名进去吧
    gitKong:@谈Xx 可以,我去增加一下,添加父类
    谈Xx:@gitKong 一样的,runtime也可以。其实用子类我觉得麻烦。
    gitKong:@谈Xx 是的,不支持继承,因为子类中没办法获取父类的属性,可能有方法获取,但我不知道 :joy:
  • 阿兹尔:还有个问题 我点击删除全部,然后再点击查询按钮 直接爆炸!版主解决下
    阿兹尔:@gitKong 版主还是很牛皮的
    阿兹尔:功力还不够没有深看!!!就尝试了下功能
    gitKong:@阿兹尔 我里面有断言机制,你没表的话,查询就会崩溃,你可以看看我断言的信息
  • Enterhoon:大神 我用你封装的异常断点 一直蹦在 id value = [model valueForKey:key]; 为什么啊 找不出原因 求帮助 :relaxed:
    gitKong:@Enterhoon 已解决,在gitHub上更新啦
    Enterhoon:求助啊啊啊啊啊啊啊啊啊
  • ee7536a9813c:like 和 star
    gitKong:@逐简 谢谢支持 :kissing_heart:
  • KnightQ丶:Hey man😉
    gitKong:@LoneWalker 哟~哟~what 's up ? pal :joy:
  • 塔罗师_Michael: :relieved: 加油,造轮子。
    gitKong:@ysghome 谢谢支持 :smile:
  • a24df6838a47:good boy
    gitKong:@kiss糖宝 谢谢支持:blush:

本文标题:FMDB 二次封装,面向模型

本文链接:https://www.haomeiwen.com/subject/ulkspttx.html