09.iOS FMDB的基本使用

@(〓〓 iOS-實用技術)[SQLite 數據庫]


目錄

  • 09.iOS FMDB的基本使用
  • 1.FMDB基本使用
    • FMDB簡介
    • FMDB的安裝方式
    • FMDB核心類
      • FMDatabase數據庫
      • FMResultSet查詢結果集
      • FMDatabaseQueue線程安全數據庫操作
    • FMDB使用步驟
  • 2.FMDabaseQueue的簡單使用
    • FMDabaseQueue簡介
    • FMDabaseQueue的使用
  • 3.FMDB FMDatabase類的簡單使用
    • 手動集成FMDB步驟
    • 創建數據庫和數據表基本步驟
    • FMDatabase數據庫的增刪改查(CRUD)
  • 4.FMDatabaseQueue數據庫隊列基本使用
    • 使用FMDatabaseQueue創建數據庫
    • FMDatabaseQueue隊列數據庫的增刪改查(CRUD)

1.FMDB基本使用

FMDB簡介

  • 1.什么是FMDB?

FMDB是iOS平臺的SQLite數據庫框架
FMDB以OC的方式封裝了SQLite的C語言API

  • 2.FMDB有什么優勢?

使用起來更加面向對象,省去了很多麻煩、冗余的C語言代碼
提供了多線程安全的數據庫操作方法,有效地防止數據混亂

FMDB的安裝方式

  • 1.Cocoapods

pod 'FMDB'

1.導入FMDB文件
2.導入系統依賴庫sqlite3.0.tbd


FMDB核心類

FMDatabase數據庫

一個FMDatabase對象就代表一個單獨的SQLite數據庫
用來執行SQL語句

FMResultSet查詢結果集

使用FMDatabase執行查詢后的結果集

FMDatabaseQueue線程安全數據庫操作

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


FMDB使用步驟

  • 1.打開數據庫
    通過指定SQLite數據庫文件路徑來創建FMDatabase對象

    • 具體文件路徑

    如果不存在會自動創建.

    • 空字符串@""

    會在臨時目錄創建一個空的數據庫當FMDatabase連接關閉時,數據庫文件也被刪除

    • nil

    會創建一個內存中臨時數據庫,當FMDatabase連接關閉時,數據庫會被銷毀

// 1.打開數據庫
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open])  { NSLog(@"打開成功!"); }

  • 2.執行更新

在FMDB中,除查詢以外的所有操作,都稱為“更新”
create、drop、insert、update、delete
使用executeUpdate:方法執行更新

// FMDB更新方法
-(BOOL)executeUpdate:(NSString)sql, ...
-(BOOL)executeUpdateWithFormat:(NSString
)format, ...
-(BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

  • 執行更新示例:
// 2.執行更新
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

  • 3.執行查詢
    • 查詢方法
    - (FMResultSet *)executeQuery:(NSString*)sql, ...
    - (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
    - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
  • 執行查詢示例:
// 查詢數據
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];

// 遍歷結果集
while ([rs next]) {
    NSString *name = [rs stringForColumn:@"name"];
    int age = [rs intForColumn:@"age"];
    double score = [rs doubleForColumn:@"score"];
}

  • 4.關閉數據庫
[self.db close];

2.FMDabaseQueue的簡單使用

FMDabaseQueue簡介

FMDatabase這個類是線程不安全的,如果在多個線程中同時使用一個FMDatabase實例,會造成數據混亂等問題
為了保證線程安全,FMDB提供方便快捷的FMDatabaseQueue類

FMDabaseQueue的使用

  • 1.FMDatabaseQueue的使用
    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
簡單使用
    [queue inDatabase:^(FMDatabase *db) {
        [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
        // 查詢
        FMResultSet *rs = [db executeQuery:@"select * from t_student"];
    }];
使用事務
    [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
        //查詢
        FMResultSet *rs = [db executeQuery:@"select * from t_student"];
    }];

3.FMDB FMDatabase類的簡單使用


手動集成FMDB步驟

  • 1.下載FMDB框架

FMDB GitHub鏈接: https://github.com/ccgus/fmdb

  • 2.將fmdb框架文件夾拖入工程
01.將fmdb框架文件夾拖入工程.png

  • 3.添加系統依賴庫sqlite3.0.tbd
2.添加系統依賴庫sqlite3.0.tbd.png

  • 4.導入FMDB.h頭文件,編譯成功.集成FMDB完成
3.導入FMDB.h頭文件.png

創建數據庫和數據表基本步驟

  • 1.拼接數據庫存儲的沙盒路徑
  • 2.通過路徑創建數據庫
  • 3.打開數據庫
    • 如果成功打開數據庫后,創建數據表.

  • 創建數據庫和數據表參考代碼

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 0.拼接數據庫存放的沙盒路徑
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
    
    // 1.通過路徑創建數據庫
    self.db = [FMDatabase databaseWithPath:sqlFilePath];
    
    // 2.打開數據庫
    if ([self.db open]) {
        NSLog(@"打開成功");
        
        BOOL success = [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER DEFAULT 1)"];
        
        if (success) {
            NSLog(@"創建表成功");
        } else {
            NSLog(@"創建表失敗");
        }
        
    } else {
        NSLog(@"打開失敗");
    }
}

FMDatabase數據庫的增刪改查(CRUD)

  • 1.插入數據
// 插入數據
static NSInteger age = 10;
age++;

BOOL success = [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];

if (success) {
    NSLog(@"插入成功");
} else {
    NSLog(@"插入失敗");
}
  • 2.刪除數據
// 刪除數據
BOOL success = [self.db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
  • 3.修改數據
// 修改數據
BOOL success = [self.db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
  • 4.查詢數據
// 查詢數據
FMResultSet *result = [self.db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];

while ([result next]) {
    int ID = [result intForColumnIndex:0];
    NSString *name = [result stringForColumnIndex:1];
    int age = [result intForColumn:@"age"];
    
    NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
}

4.FMDatabaseQueue數據庫隊列基本使用

使用FMDatabaseQueue類在多線程中執行多個查詢或更新是線程安全的.

使用FMDatabaseQueue創建數據庫

  • 1.創建一個FMDatabaseQueue對象

只要成功創建數據庫隊列對象,FMDB內部就會自動給我們加載數據庫對象.無需再執行打開數據庫操作.

  • 2.使用block傳遞數據庫

使用 inDatabase:方法傳遞數據庫對象.

  • 3.使用SQL語句創建數據表
- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 0.拼接數據庫存放的沙盒路徑
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
    
    // 1.創建一個FMDatabaseQueue對象
    // 只要創建數據庫隊列對象, FMDB內部就會自動給我們加載數據庫對象
    self.dbQueue = [FMDatabaseQueue databaseQueueWithPath:sqlFilePath];
    
    // 2.執行操作
    // 會通過block傳遞隊列中創建好的數據庫
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        
        BOOL success = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER DEFAULT 1);"];
        
        if (success) {
            NSLog(@"創建表成功");
        } else {
            NSLog(@"創建表失敗");
        }
        
    }];
    
}

FMDatabaseQueue隊列數據庫的增刪改查(CRUD)

  • 1.插入數據
- (IBAction)insertClick {
    
    static NSInteger age = 10;
    age++;
    
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        
        BOOL success = [db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];
        
        if (success) {
            NSLog(@"插入成功");
        } else {
            NSLog(@"插入失敗");
        }
    }];
    
}
  • 2.刪除數據
// 刪除數據
[self.dbQueue inDatabase:^(FMDatabase *db) {
    
    BOOL success = [db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
        
    // 判斷是否SQL是否執行成功   
    // ...
}
  • 3.修改數據
// 修改數據
[self.dbQueue inDatabase:^(FMDatabase *db) {
        
    BOOL success = [db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
    
    // 判斷是否SQL是否執行成功  
    // ...
}
  • 4.查詢數據
// 查詢數據
- (IBAction)queryClick {
    
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        
        FMResultSet *result = [db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];
        
        while ([result next]) {
            int ID = [result intForColumnIndex:0];
            NSString *name = [result stringForColumnIndex:1];
            int age = [result intForColumn:@"age"];
            
            NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
        }
    }];
    
    
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容