iOS FMDB 數(shù)據(jù)庫~詳解

//聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄

一、簡單說明

1.什么是FMDB

FMDB是iOS平臺的SQLite數(shù)據(jù)庫框架

FMDB以O(shè)C的方式封裝了SQLite的C語言API

2.FMDB的優(yōu)點

使用起來更加面向?qū)ο箢砣唬∪チ撕芏嗦闊┕翘铩⑷哂嗟?a target="_blank" rel="nofollow">c語言代碼

對比蘋果自帶的Core Data框架,更加輕量級和靈活

提供了多線程安全的數(shù)據(jù)庫操作方法,有效地防止數(shù)據(jù)混亂

FMDB PK Sqlite

優(yōu)點:

對多線程的并發(fā)操作進行處理萍歉,所以是線程安全的喇肋;

以O(shè)C的方式封裝了SQLite的C語言API坟乾,使用起來更加的方便;

FMDB是輕量級的框架蝶防,使用靈活甚侣。

缺點:

因為它是OC的語言封裝的,只能在ios開發(fā)的時候使用间学,所以在實現(xiàn)跨平臺操作的時候存在局限性殷费。

3.FMDB的github地址

https://github.com/ccgus/fmdb

二印荔、核心類

FMDB有三個主要的類

(1)FMDatabase

一個FMDatabase對象就代表一個單獨的SQLite數(shù)據(jù)庫

用來執(zhí)行SQL語句

(2)FMResultSet

使用FMDatabase執(zhí)行查詢后的結(jié)果集

(3)FMDatabaseQueue

用于在多線程中執(zhí)行多個查詢或更新,它是線程安全的

三宗兼、打開數(shù)據(jù)庫

通過指定SQLite數(shù)據(jù)庫文件路徑來創(chuàng)建FMDatabase對象

FMDatabase *db = [FMDatabase databaseWithPath:path];

if (![db open]) {

NSLog(@"數(shù)據(jù)庫打開失旛镉恪!");

}

文件路徑有三種情況

(1)具體文件路徑

如果不存在會自動創(chuàng)建

(2)空字符串@""

會在臨時目錄創(chuàng)建一個空的數(shù)據(jù)庫

當(dāng)FMDatabase連接關(guān)閉時殷绍,數(shù)據(jù)庫文件也被刪除

(3)nil

會創(chuàng)建一個內(nèi)存中臨時數(shù)據(jù)庫染苛,當(dāng)FMDatabase連接關(guān)閉時,數(shù)據(jù)庫會被銷毀

四主到、執(zhí)行更新

在FMDB中茶行,除查詢以外的所有操作,都稱為“更新”

create登钥、drop畔师、insert、update牧牢、delete等

使用executeUpdate:方法執(zhí)行更新

- (BOOL)executeUpdate:(NSString*)sql, ...

- (BOOL)executeUpdateWithFormat:(NSString*)format, ...

- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

示例

[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

五看锉、執(zhí)行查詢

查詢方法

- (FMResultSet *)executeQuery:(NSString*)sql, ...

- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...

- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments

示例

// 查詢數(shù)據(jù)

FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];

// 遍歷結(jié)果集

while ([rs next]) {

NSString *name = [rs stringForColumn:@"name"];

int age = [rs intForColumn:@"age"];

double score = [rs doubleForColumn:@"score"];

}

二、 FMDB使用步驟

下載FMDB文件GitHub,并將FMDB文件夾添加到項目中(也可使用CocoaPods導(dǎo)入)

導(dǎo)入libsqlite3.0框架塔鳍,導(dǎo)入頭文件FMDatabase.h

代碼實現(xiàn)伯铣,與SQLite使用步驟相似,創(chuàng)建數(shù)據(jù)庫路徑轮纫,獲得數(shù)據(jù)庫路徑腔寡,打開數(shù)據(jù)庫,然后對數(shù)據(jù)庫進行增掌唾、刪放前、改、查操作糯彬,最后關(guān)閉數(shù)據(jù)庫凭语。

step.png

數(shù)據(jù)庫創(chuàng)建

創(chuàng)建FMDatabase對象時參數(shù)為SQLite數(shù)據(jù)庫文件路徑,該路徑可以是以下三種方式之一

文件路徑撩扒。該文件路徑無需真實存在叽粹,如果不存在會自動創(chuàng)建

空字符串(@“”)。表示會在臨時目錄創(chuàng)建一個空的數(shù)據(jù)庫却舀,當(dāng)FMDatabase連接關(guān)閉時虫几,文件也會被刪除

NULL。將創(chuàng)建一個內(nèi)在數(shù)據(jù)庫挽拔,同樣的辆脸,當(dāng)FMDatabase連接關(guān)閉時,數(shù)據(jù)將會被銷毀

本文中使用的測試模型類.h

student.png

數(shù)據(jù)庫使用FMDB框架代碼操作

使用FMDataBase類建立數(shù)據(jù)庫

//1.獲得數(shù)據(jù)庫文件的路徑NSString*doc =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)? lastObject];NSString*fileName = [doc stringByAppendingPathComponent:@“student.sqlite”];//2.獲得數(shù)據(jù)庫FMDatabase *db = [FMDatabase databaseWithPath:fileName];//3.使用如下語句螃诅,如果打開失敗啡氢,可能是權(quán)限不足或者資源不足状囱。通常打開完操作操作后,需要調(diào)用 close 方法來關(guān)閉數(shù)據(jù)庫倘是。在和數(shù)據(jù)庫交互 之前亭枷,數(shù)據(jù)庫必須是打開的。如果資源或權(quán)限不足無法打開或創(chuàng)建數(shù)據(jù)庫搀崭,都會導(dǎo)致打開失敗叨粘。if([db open])? {//4.創(chuàng)表BOOLresult = [db executeUpdate:@“CREATE TABLE IF NOT EXISTS t_student (idinteger PRIMARY KEY AUTOINCREMENT, name text NOTNULL, age integer NOTNULL);”];if(result)? ? ? ? {NSLog(@“創(chuàng)建表成功”);? ? ? ? }? }

查看sql表

根據(jù)路徑fileName在Finder中搜索.sqlite文件,并復(fù)制到桌面

使用火狐瀏覽器工具下的SQLite Manager打開.sqlite文件

2.png

數(shù)據(jù)表結(jié)構(gòu)

sql.png

使用FMDataBase類執(zhí)行數(shù)據(jù)庫命令SQL

一切不是SELECT命令的命令都視為更新瘤睹。這包括 CREAT,UPDATE,INSERT,ALTER,BEGIN,COMMIT,DETACH,DELETE,DROP,END,EXPLAIN,VACUUM,REPLACE等升敲。

簡單來說,只要不是以SELECT開頭的命令都是更新命令轰传。

執(zhí)行更新返回一個BOOL值驴党。YES表示 執(zhí)行成功,否則表示有錯誤获茬。你可以調(diào)用 -lastErrorMessage 和 -lastErrorCode方法來得到更多信息港庄。

使用FMDataBase類執(zhí)行數(shù)據(jù)庫插入命令SQLinsert into

int age = 42; //1.executeUpdate:不確定的參數(shù)用?來占位(后面參數(shù)必須是oc對象恕曲,鹏氧;代表語句結(jié)束) [self.db executeUpdate:@“INSERTINTOt_student (name, age)VALUES(?,?);”,name,@(age)];? ? //2.executeUpdateWithForamat:不確定的參數(shù)用%@,%d等來占位 (參數(shù)為原始數(shù)據(jù)類型码俩,執(zhí)行語句不區(qū)分大小寫) [self.db executeUpdateWithForamat:@“insertintot_student (name,age)values(%@,%i);”,name,age];? ? //3.參數(shù)是數(shù)組的使用方式 [self.db executeUpdate:@“INSERTINTOt_student(name,age)VALUES(?,?);”withArgumentsInArray:@[name,@(age? ? ? ? ? ? ? ? )]];

使用FMDataBase類執(zhí)行數(shù)據(jù)庫刪除命令SQLdelete

//1.不確定的參數(shù)用?來占位 (后面參數(shù)必須是oc對象,需要將int包裝成OC對象)intidNum =101;? ? [self.db executeUpdate:@“deletefrom t_student where id = ?;”,@(idNum)];//2.不確定的參數(shù)用%@歼捏,%d等來占位[self.db executeUpdateWithFormat:@“deletefrom t_student where name = %@;”,@“apple_name”];

使用FMDataBase類執(zhí)行數(shù)據(jù)庫修改命令SQLupdate

//修改學(xué)生的名字? [self.db executeUpdate:@“updatet_studentsetname= ?wherename= ?”,newName,oldName];

使用FMDataBase類執(zhí)行數(shù)據(jù)庫查詢命令SQLselect ... from

SELECT命令就是查詢稿存,執(zhí)行查詢的方法是以-excuteQuery開頭的。

執(zhí)行查詢時瞳秽,如果成功返回FMResultSet對象瓣履,錯誤返回nil。與執(zhí)行更新相當(dāng)练俐,支持使用NSError參數(shù)袖迎。

同時,你也可以使用-lastErrorCode和-lastErrorMessage獲知錯誤信息腺晾。

FMResultSet獲取不同數(shù)據(jù)格式的方法

intForColumn:

longForColumn:

longLongIntForColumn:

boolForColumn:

doubleForColumn:

stringForColumn:

dataForColumn:

dataNoCopyForColumn:

UTF8StringForColumnIndex:

objectForColumn:

使用FMResultSet獲取查詢語句結(jié)果

//查詢整個表FMResultSet *resultSet = [self.db execute Query:@“select* from t_student;”];//根據(jù)條件查詢FMResultSet *resultSet = [self.db executeQuery:@“select* from t_student where id

使用FMDataBase類執(zhí)行數(shù)據(jù)庫銷毀命令SQLdrop ...

//如果表格存在 則銷毀? [self.db executeUpadate:@“droptableifexistst_student;”];

使用FMDatabaseQueue類實現(xiàn)多線程操作

在多個線程中同時使用一個FMDatabase實例是不明智的⊙嘧叮現(xiàn)在你可以為每 個線程創(chuàng)建一個FMDatabase對象,不要讓多個線程分享同一個實例悯蝉,他無 法在多個線程中同事使用归形。否則程序會時不時崩潰或者報告異常。所以鼻由,不要 初始化FMDatabase對象暇榴,然后在多個線程中使用厚棵。這時候,我們就需要使 用FMDatabaseQueue來創(chuàng)建隊列執(zhí)行事務(wù)蔼紧。

//1.創(chuàng)建隊列FMDatabaseQueue *queue = [FMDatabaseQueuedatabaseQueueWithPath:aPath];? __block BOOL whoopsSomethingWrongHappened =true;//2.把任務(wù)包裝到事務(wù)里[queueinTransaction:^(FMDatabase *db, BOOL *rollback)? ? {? whoopsSomethingWrongHappened &=? [dbexecuteUpdate:@“INSERT INTO myTable VALUES (?)”,? ? [NSNumber numberWith:1]];whoopsSomethingWrongHappened &= [dbexecuteUpdata:@“INSERT INTO myTable VALUES (?)”, [NSNumber numberWithInt:2]];whoopsSomethingWrongHappened &= [dbexecuteUpdata:@“INSERT INTO myTable VALUES (?)”[NSNumber? numberWithInt:3]];//如果有錯誤 返回if(!whoopsSomethingWrongHappened)? {? ? *rollback = YES;return;? }}];

好了婆硬,到此為止,相信你已經(jīng)能夠使用FMDB進行數(shù)據(jù)持久化了奸例,它的好與壞 只有在不斷地使用過程中才能發(fā)現(xiàn)了解彬犯。所以,希望大家學(xué)會了以后還是要多 寫多練多使用哩至。另外躏嚎,誠心希望大家多提寶貴意見,或者溝通一些好的想法菩貌。

謝謝!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卢佣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子箭阶,更是在濱河造成了極大的恐慌虚茶,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仇参,死亡現(xiàn)場離奇詭異嘹叫,居然都是意外死亡,警方通過查閱死者的電腦和手機诈乒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門罩扇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怕磨,你說我怎么就攤上這事喂饥。” “怎么了肠鲫?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵员帮,是天一觀的道長。 經(jīng)常有香客問我导饲,道長捞高,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任渣锦,我火速辦了婚禮硝岗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袋毙。我一直安慰自己辈讶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布娄猫。 她就那樣靜靜地躺著贱除,像睡著了一般生闲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上月幌,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天碍讯,我揣著相機與錄音,去河邊找鬼扯躺。 笑死捉兴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的录语。 我是一名探鬼主播倍啥,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼澎埠!你這毒婦竟也來了虽缕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒲稳,失蹤者是張志新(化名)和其女友劉穎氮趋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體江耀,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡剩胁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了祥国。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昵观。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舌稀,靈堂內(nèi)的尸體忽然破棺而出啊犬,到底是詐尸還是另有隱情,我是刑警寧澤扩借,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布椒惨,位于F島的核電站缤至,受9級特大地震影響潮罪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜领斥,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一嫉到、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧月洛,春花似錦何恶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惜辑。三九已至拧簸,卻和暖如春交排,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曾我。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工捧搞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抵卫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓胎撇,卻偏偏與公主長得像介粘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晚树,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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