把FMDB封装到自己满意的程度

前言:
选一个数据库作为主力,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非关系型的存储.
应该是可以的.
我会在下一篇文章给出我的答案 以及这个想法的由来和适用场景 .

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

推荐阅读更多精彩内容