对fmdb再封装

作者: TEASON | 来源:发表于2017-05-04 21:52 被阅读730次

    前言:
    选一个数据库作为主力,realm,coredata,sqlite这三个我纠结之后还是选了sqlite. 有很多原因,不展开了. 但fmdb用起来有一些蛋疼.很多重复代码. 有必要做个工具提高效率了.

    在决定自己封装fmdb之前.已经有人做了相关的东西.不过有些地方还是不能满足我的需求. 比如我想特指某个字符串做主键. 于是自己动手实现了.但在实现过程中发现了疑虑. model制表肯定牵涉到映射相关的问题. 想来想去. 要做个通用的数据库工具. 还是做成能够默认自增数字主键最合适. 那么, 要解决我的需求. 其实还可以用sql关键字修饰某个字段 .

    XTFMDB

    特性

    1. Model直接存储.获取. 无需再转换
    2. 增删改查. 脱离sql语句
    3. 主键自增. 插入不需设主键. pkid
    4. Model满足. 无容器, 无嵌套. model的第一个属性必须是数字主键.且命名中须包含'pkid'.默认为pkid
    5. 任何操作. 线程安全
    6. 批量操作支持实务. 支持操作失败事务回滚. 且线程安全
    7. 支持 每个字段自定义设置关键字. 已经集成默认关键字, 以下情况无需再写( NOT NULL, DEFAULT''字符类型默认值,DEFAULT'0'数字类型默认值 )
    8. 可指定哪些字段不参与建表.

    使用方法

    导入 XTFMDB.h

    初始化 在app启动时调用配置函数

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    // 在这初始化数据库
    [[XTFMDBbase sharedInstance] configureDB:@"akateason"] ;
    
    return YES;
    }
    
    

    使用CRUD

    先创建一个自定义模型类Model1

    支持两种建模方式

    方式1) XTDBModel的子类, 可以直接实现对数据库操作增删改查等.并且无需设置主键pkid

    @interface Model1 : XTDBModel
    // 无需设置主键 默认 pkid
    @property (nonatomic)       int             age         ;
    @property (nonatomic)       float           floatVal    ;
    @property (nonatomic)       long long       tick        ;
    @property (nonatomic,copy)  NSString        *title      ;
    @property (nonatomic,copy)  NSString        *abcabc     ; // 不想在表里出现这个 !!
    @end
    

    方式2) 任意创建一个类, 可以直接实现对数据库操作增删改查等.但需要手动设置主键pkid

    @interface Model1 : NSObject
    @property (nonatomic)       int             pkid        ; // primary key
    @property (nonatomic)       int             age         ;
    @property (nonatomic)       float           floatVal    ;
    @property (nonatomic)       long long       tick        ;
    @property (nonatomic,copy)  NSString        *title      ;
    @property (nonatomic,copy)  NSString        *abcabc     ; // 不想在表里出现这个 !!
    @end
    

    可配置各个字段关键字

    注意:

    1. 在.m中覆盖基类modelPropertiesSqliteKeywords方法. 返回一个Dictionary. key为字段名. val为关键字, 加入想要多个关键字,以空格隔开即可 .
    2. 无需添加NOT NULLDEFAULT关键字. (已集成) .
    + (NSDictionary *)modelPropertiesSqliteKeywords
    {
    return @{
    @"title" : @"UNIQUE" ,  // 
    ...           
    } ;
    }
    

    配置不想参与建表的字段

    在.m中覆盖基类ignoreProperties方法. 返回Array. 列出不想参与建表的字段

    + (NSArray *)ignoreProperties
    {
    return @[
    @"abcabc" ,
    ...
    ] ;
    }
    
    只需要导入`"XTFMDB.h"就可使用

    创建表

    1. 马上创建一张名为Model1的数据库表
    [Model1 xt_createTable] ; // [Model1 createTable] ; 当Model1是XTDBModel子类时,也可以用这个方法.以下方法均可以同上.
    

    插入

    1. 插入单个
    // 生成aModel对象. 直接插入
    int lastRowID = [aModel xt_insert] ; // 默认返回Sqlite LastRowId
    
    1. 批量插入
    Bool isSuccess = [Model1 xt_insertList:modelList] ;
    

    更新

    1. 更新单个
    Bool isSuccess = [aModel xt_update] ;
    
    1. 批量更新
    Bool isSuccess = [Model1 xt_updateList:modelList] ;
    

    查询

    1. 查询表中所有数据
    NSArray *list = [Model1 xt_selectAll] ;
    
    1. 按条件查询
    NSArray *list = [Model1 xt_selectWhere:@" title = 'aaaaaa' "] ; // 直接传入where条件即可
    
    1. 按条件查询单个
    Model1 *model = [Model1 xt_findFirstWhere:@"pkid == 2"] ;
    
    1. 按条件查询是否包含
    BOOL isContained = [Model1 xt_hasModelWhere:@"pkid == 1"] ;
    

    删除

    1. 删除当前Model
    BOOL isDel = [aModel xt_deleteModel] ;
    
    1. 按条件删除某Model
    BOOL isDel = [Model1 xt_deleteModelWhere:@" title == 'aaa' "] ;
    
    1. 删除本表
    BOOL isDel = [Model1 xt_dropTable] ;
    

    源码在此
    你的star是我的动力
    有任何疑问或建议. 欢迎在github或博客里issue我. 轻喷.


    接前言提问:
    那个问题用unique关键字解决了.


    此外我还有一些奇怪的想法留在文末.
    这个工具几乎可以处理客户端通常遇到的关系型表的问题.
    倘若不换数据库. 是否能够去实现一些类似nosql非关系型的存储.
    应该是可以的.
    我会在下一篇文章给出我的答案 以及这个想法的由来和适用场景 .

    相关文章

      网友评论

      • TEASON:@Ryan文濤 realm像楼上说的,夸线程有坑,但我还未深入研究过。优点是小快灵也跨平台。
        我选SQLIte因为我了解sql语句,和后台理论上可以联通。
      • 欧阳蓝缺:需要修改 Model 的基类,不爽!
        TEASON:@欧阳蓝缺 兄弟,你理解工厂设计模式吗,抽象类的概念。参考realm也是类似的结构喔。
        欧阳蓝缺:按你的设计,Model 需要继承于 XTDBModel,这就有一定入侵性。
        TEASON:@欧阳蓝缺 能不能描述清楚点:smile:
      • Ryan文濤:realm 你觉得怎么样呢??
        Jisen:坑多,入侵性强,读取数据是快但是写数据不怎么样

      本文标题:对fmdb再封装

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