把FMDB封裝到自己滿意的程度

前言:
選一個(gè)數(shù)據(jù)庫(kù)作為主力,realm,coredata,sqlite這三個(gè)我糾結(jié)之后還是選了sqlite. 有很多原因,不展開了. 但fmdb用起來有一些蛋疼.很多重復(fù)代碼. 有必要做個(gè)工具提高效率了.

在決定自己封裝fmdb之前.已經(jīng)有人做了相關(guān)的東西.不過有些地方還是不能滿足我的需求. 比如我想特指某個(gè)字符串做主鍵. 于是自己動(dòng)手實(shí)現(xiàn)了.但在實(shí)現(xiàn)過程中發(fā)現(xiàn)了疑慮. model制表肯定牽涉到映射相關(guān)的問題. 想來想去. 要做個(gè)通用的數(shù)據(jù)庫(kù)工具. 還是做成能夠默認(rèn)自增數(shù)字主鍵最合適. 那么, 要解決我的需求. 其實(shí)還可以用sql關(guān)鍵字修飾某個(gè)字段 .

XTFMDB

特性

  1. Model直接存儲(chǔ).獲取. 無需再轉(zhuǎn)換
  2. 增刪改查. 脫離sql語句
  3. 主鍵自增. 插入不需設(shè)主鍵. pkid
  4. Model滿足. 無容器, 無嵌套. model的第一個(gè)屬性必須是數(shù)字主鍵.且命名中須包含'pkid'.默認(rèn)為pkid
  5. 任何操作. 線程安全
  6. 批量操作支持實(shí)務(wù). 支持操作失敗事務(wù)回滾. 且線程安全
  7. 支持 每個(gè)字段自定義設(shè)置關(guān)鍵字. 已經(jīng)集成默認(rèn)關(guān)鍵字, 以下情況無需再寫( NOT NULL, DEFAULT''字符類型默認(rèn)值,DEFAULT'0'數(shù)字類型默認(rèn)值 )
  8. 可指定哪些字段不參與建表.

使用方法

導(dǎo)入 XTFMDB.h

初始化 在app啟動(dòng)時(shí)調(diào)用配置函數(shù)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 在這初始化數(shù)據(jù)庫(kù)
[[XTFMDBbase sharedInstance] configureDB:@"akateason"] ;

return YES;
}


使用CRUD

先創(chuàng)建一個(gè)自定義模型類Model1

支持兩種建模方式

方式1) XTDBModel的子類, 可以直接實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)操作增刪改查等.并且無需設(shè)置主鍵pkid

@interface Model1 : XTDBModel
// 無需設(shè)置主鍵 默認(rèn) pkid
@property (nonatomic)       int             age         ;
@property (nonatomic)       float           floatVal    ;
@property (nonatomic)       long long       tick        ;
@property (nonatomic,copy)  NSString        *title      ;
@property (nonatomic,copy)  NSString        *abcabc     ; // 不想在表里出現(xiàn)這個(gè) !!
@end

方式2) 任意創(chuàng)建一個(gè)類, 可以直接實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)操作增刪改查等.但需要手動(dòng)設(shè)置主鍵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     ; // 不想在表里出現(xiàn)這個(gè) !!
@end

可配置各個(gè)字段關(guān)鍵字

注意:

  1. 在.m中覆蓋基類modelPropertiesSqliteKeywords方法. 返回一個(gè)Dictionary. key為字段名. val為關(guān)鍵字, 加入想要多個(gè)關(guān)鍵字,以空格隔開即可 .
  2. 無需添加NOT NULLDEFAULT關(guān)鍵字. (已集成) .
+ (NSDictionary *)modelPropertiesSqliteKeywords
{
return @{
@"title" : @"UNIQUE" ,  // 
...           
} ;
}

配置不想?yún)⑴c建表的字段

在.m中覆蓋基類ignoreProperties方法. 返回Array. 列出不想?yún)⑴c建表的字段

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

創(chuàng)建表

  1. 馬上創(chuàng)建一張名為Model1的數(shù)據(jù)庫(kù)表
[Model1 xt_createTable] ; // [Model1 createTable] ; 當(dāng)Model1是XTDBModel子類時(shí),也可以用這個(gè)方法.以下方法均可以同上.

插入

  1. 插入單個(gè)
// 生成aModel對(duì)象. 直接插入
int lastRowID = [aModel xt_insert] ; // 默認(rèn)返回Sqlite LastRowId
  1. 批量插入
Bool isSuccess = [Model1 xt_insertList:modelList] ;

更新

  1. 更新單個(gè)
Bool isSuccess = [aModel xt_update] ;
  1. 批量更新
Bool isSuccess = [Model1 xt_updateList:modelList] ;

查詢

  1. 查詢表中所有數(shù)據(jù)
NSArray *list = [Model1 xt_selectAll] ;
  1. 按條件查詢
NSArray *list = [Model1 xt_selectWhere:@" title = 'aaaaaa' "] ; // 直接傳入where條件即可
  1. 按條件查詢單個(gè)
Model1 *model = [Model1 xt_findFirstWhere:@"pkid == 2"] ;
  1. 按條件查詢是否包含
BOOL isContained = [Model1 xt_hasModelWhere:@"pkid == 1"] ;

刪除

  1. 刪除當(dāng)前Model
BOOL isDel = [aModel xt_deleteModel] ;
  1. 按條件刪除某Model
BOOL isDel = [Model1 xt_deleteModelWhere:@" title == 'aaa' "] ;
  1. 刪除本表
BOOL isDel = [Model1 xt_dropTable] ;

源碼在此
你的star是我的動(dòng)力
有任何疑問或建議. 歡迎在github或博客里issue我. 輕噴.


接前言提問:
那個(gè)問題用unique關(guān)鍵字解決了.


此外我還有一些奇怪的想法留在文末.
這個(gè)工具幾乎可以處理客戶端通常遇到的關(guān)系型表的問題.
倘若不換數(shù)據(jù)庫(kù). 是否能夠去實(shí)現(xiàn)一些類似nosql非關(guān)系型的存儲(chǔ).
應(yīng)該是可以的.
我會(huì)在下一篇文章給出我的答案 以及這個(gè)想法的由來和適用場(chǎng)景 .

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劈榨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搪柑,更是在濱河造成了極大的恐慌擎淤,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滓走,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鲤竹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昔榴,“玉大人辛藻,你說我怎么就攤上這事』ザ” “怎么了吱肌?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)仰禽。 經(jīng)常有香客問我氮墨,道長(zhǎng),這世上最難降的妖魔是什么吐葵? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任规揪,我火速辦了婚禮,結(jié)果婚禮上温峭,老公的妹妹穿的比我還像新娘猛铅。我一直安慰自己,他們只是感情好凤藏,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布奸忽。 她就那樣靜靜地躺著,像睡著了一般清笨。 火紅的嫁衣襯著肌膚如雪月杉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天抠艾,我揣著相機(jī)與錄音苛萎,去河邊找鬼。 笑死检号,一個(gè)胖子當(dāng)著我的面吹牛腌歉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播齐苛,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼翘盖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了凹蜂?” 一聲冷哼從身側(cè)響起馍驯,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤阁危,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后汰瘫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狂打,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年混弥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趴乡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝗拿,死狀恐怖晾捏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哀托,我是刑警寧澤惦辛,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站萤捆,受9級(jí)特大地震影響裙品,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俗或,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一市怎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辛慰,春花似錦区匠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至速客,卻和暖如春戚篙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溺职。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工岔擂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浪耘。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓乱灵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親七冲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痛倚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容