FFDB

FMDB的使用

FMDB
Demo

目錄

1信卡、FMDB介紹
2娶聘、FMDB導(dǎo)入
3、FMDB框架中重要的框架類
3.1斥滤、FMDatabase
3.1.1将鸵、數(shù)據(jù)庫路徑
3.1.2、使用FMDataBase類執(zhí)行數(shù)據(jù)庫命令SQL
3.1.3佑颇、創(chuàng)建數(shù)據(jù)庫
3.1.4顶掉、創(chuàng)建表
3.1.5、插入指令insert
3.1.6挑胸、刪除指令delete
3.1.7痒筒、更新指令update
3.2、FMResultSet
3.2.1嗜暴、查詢指令select
3.3凸克、FMDatabaseQueue
3.3.1、使用FMDatabaseQueue類實(shí)現(xiàn)多線程操作
4數(shù)據(jù)庫相關(guān)文章

1闷沥、FMDB介紹

FMDB是一款簡潔萎战、易用的封裝庫。
因此舆逃,在這里推薦使用第三方框架FMDB蚂维,它是對libsqlite3框架的封裝,用起來的步驟與SQLite使用類似路狮,并且它對于多線程的并發(fā)操作進(jìn)行了處理虫啥,所以是線程安全的。

  • 對多線程的并發(fā)操作進(jìn)行處理奄妨,所以是線程安全的涂籽。
  • 以O(shè)C的方式封裝了SQLite的C語言API,使用起來更加的方便砸抛。
  • FMDB是輕量級的框架评雌,使用靈活树枫。

2、FMDB導(dǎo)入

cocoapods導(dǎo)入
導(dǎo)入libsqlite3.0.tbd
導(dǎo)入頭文件#import <FMDB/FMDB.h>

platform :ios, '8.0'
use_frameworks!

target 'FMDB-Demo' do
    pod 'FMDB'
end

3景东、FMDB框架中重要的框架類

  • 3.1 FMDatabase:
    FMDatabase對象就代表一個單獨(dú)的SQLite數(shù)據(jù)庫砂轻,用來執(zhí)行SQL語句。

  • 3.2 FMResultSet:
    使用FMDatabase執(zhí)行查詢后的結(jié)果集斤吐。

  • 3.3 FMDatabaseQueue:
    用于在多線程中執(zhí)行多個查詢或更新搔涝,它是線程安全的。

3.1.1和措、數(shù)據(jù)庫路徑

創(chuàng)建FMDatabase對象時參數(shù)為SQLite數(shù)據(jù)庫文件路徑庄呈。

  • 文件路徑。該文件路徑無需真實(shí)存在派阱,如果不存在會自動創(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ù)將會被銷毀
NSString *lidDirPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSString *databasePath = [lidDirPath stringByAppendingPathComponent:@"DatabaseDemo.sqlite"];

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

  • executeUpdate:
    一切不是SELECT命令的命令都視為更新贮聂。這包括
    CREAT靠柑,UPDATE,INSERT吓懈,ALTER,BEGIN耻警,COMMIT隔嫡,DETACH,DELETE甘穿,DROP腮恩,END,EXPLAIN温兼,VACUUM秸滴,REPLACE等。

  • executeQuery:
    SELECT開頭的命令
    執(zhí)行更新返回一個BOOL值募判。YES表示執(zhí)行成功荡含,No則表示有錯誤咒唆。
    你可以調(diào)用-lastErrorMessage和-lastErrorCode方法來得到更多信息。

注意:執(zhí)行語句不區(qū)分大小寫内颗。

3.1.3钧排、創(chuàng)建數(shù)據(jù)庫
// 根據(jù)指定的沙盒路徑來創(chuàng)建數(shù)據(jù)對象,如果路徑下的數(shù)據(jù)庫不存在均澳,就創(chuàng)建恨溜,如果存在就不創(chuàng)建
self.database = [FMDatabase databaseWithPath:databasePath];
if (self.database != nil) {
    NSLog(@"數(shù)據(jù)庫創(chuàng)建成功!");
} else {
    NSLog(@"數(shù)據(jù)庫創(chuàng)建失敗!");
}
3.1.4、創(chuàng)建表
// 所有的數(shù)據(jù)庫SQL語句找前,都需要數(shù)據(jù)庫打開之后才能操作
if ([self.database open]) {
    NSString *createTableSql = @"create table if not exists User(id integer primary key autoincrement, username text not null, phone text not null, age integer)";
    BOOL result = [self.database executeUpdate:createTableSql];
    if (result) {
        NSLog(@"創(chuàng)建表成功");
    } else {
        NSLog(@"創(chuàng)建表失敗");
    }
    // 每次執(zhí)行完對應(yīng)SQL之后糟袁,要關(guān)閉數(shù)據(jù)庫
    [self.database close];
}

創(chuàng)建成功后能在沙盒路徑文件夾下看到.sqlite文件


image.png
3.1.5、插入指令insert
if ([self.database open]) {
    NSString *insertSql = @"insert into User(username, phone, age) values(?, ?, ?)";
    BOOL result = [self.database executeUpdate:insertSql, @"user01", @"110", @(18)];
    if (result) {
        NSLog(@"插入數(shù)據(jù)成功");
    } else {
        NSLog(@"插入數(shù)據(jù)失敗");
    }
    [self.database close];
}

可以看到數(shù)據(jù)庫插入了一條數(shù)據(jù)


image.png
3.1.6躺盛、刪除指令delete
if ([self.database open]) {
    NSString *deleteSql = @"delete from User where username = ?";
    BOOL result = [self.database executeUpdate:deleteSql, @"user01"];
    if (result) {
        NSLog(@"刪除數(shù)據(jù)成功");
    } else {
        NSLog(@"刪除數(shù)據(jù)失敗");
    }
    [self.database close];
}

可以看到數(shù)據(jù)庫對應(yīng)數(shù)據(jù)被刪除了


image.png
3.1.7项戴、更新指令update
if ([self.database open]) {
    NSString *updateSql = @"update User set phone = ? where username = ?";
    BOOL result = [self.database executeUpdate:updateSql, @"15823456789", @"user01"];
    if (result) {
        NSLog(@"更新數(shù)據(jù)成功");
    } else {
        NSLog(@"更新數(shù)據(jù)失敗");
    }
    [self.database close];
}

可以看到數(shù)據(jù)庫對應(yīng)數(shù)據(jù)更新了數(shù)據(jù)


image.png
3.2.1、查詢指令select
if ([self.database open]) {
    NSString *selectSql = @"select * from User";
    FMResultSet *resultSet = [self.database executeQuery:selectSql];
    while ([resultSet next]) {
    NSString *username = [resultSet stringForColumn:@"username"];
    NSString *phone = [resultSet stringForColumn:@"phone"];
    NSInteger age = [resultSet intForColumn:@"age"];
    NSLog(@"username=%@, phone=%@, age=%ld \n", username, phone, age);
    }
    [self.database close];
}

打印結(jié)果:

2018-02-05 01:22:50.519489+0800 FMDBDemo[2960:227862] username=user01, phone=15823456789, age=18
2018-02-05 01:22:50.519661+0800 FMDBDemo[2960:227862] username=user02, phone=10086, age=20

3.3.1槽惫、使用FMDatabaseQueue類實(shí)現(xiàn)多線程操作

在多個線程中同時使用一個FMDatabase實(shí)例是不明智的≈芏#現(xiàn)在你可以為每個線程創(chuàng)建一個FMDatabase對象,不要讓多個線程分享同一個實(shí)例界斜,他無法在多個線程中同時使用仿耽。否則程序會時不時崩潰或者報(bào)告異常。所以各薇,不要初始化FMDatabase對象项贺,然后在多個線程中使用。這時候峭判,我們就需要使 用FMDatabaseQueue來創(chuàng)建隊(duì)列執(zhí)行事務(wù)开缎。

self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:databasePath];
// // 要執(zhí)行的SQL語句,要放在Block里執(zhí)行林螃,用inDatabase不用手動打開和關(guān)閉數(shù)據(jù)庫
[self.databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
    // 創(chuàng)建表奕删,增加,刪除疗认,更新急侥,查詢 操作
}];

注意block捕捉變量,使用__block BOOL result = NO;

4侮邀、數(shù)據(jù)庫相關(guān)文章

Mac終端查看sqlite3數(shù)據(jù)庫坏怪、表數(shù)據(jù)等(含sqlite可視化工具下載)

參考文章:
FMDB的使用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绊茧,隨后出現(xiàn)的幾起案子铝宵,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹏秋,死亡現(xiàn)場離奇詭異尊蚁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)侣夷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門横朋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人百拓,你說我怎么就攤上這事琴锭。” “怎么了衙传?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵决帖,是天一觀的道長。 經(jīng)常有香客問我蓖捶,道長地回,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任俊鱼,我火速辦了婚禮刻像,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘并闲。我一直安慰自己绎速,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布焙蚓。 她就那樣靜靜地躺著,像睡著了一般洒宝。 火紅的嫁衣襯著肌膚如雪购公。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天雁歌,我揣著相機(jī)與錄音宏浩,去河邊找鬼。 笑死靠瞎,一個胖子當(dāng)著我的面吹牛比庄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乏盐,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼佳窑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了父能?” 一聲冷哼從身側(cè)響起神凑,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溉委,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹃唯,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年瓣喊,在試婚紗的時候發(fā)現(xiàn)自己被綠了坡慌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡藻三,死狀恐怖洪橘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趴酣,我是刑警寧澤梨树,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站岖寞,受9級特大地震影響抡四,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仗谆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一指巡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隶垮,春花似錦藻雪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹋偏,卻和暖如春便斥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背威始。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工枢纠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人黎棠。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓晋渺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脓斩。 傳聞我的和親對象是個殘疾皇子木西,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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