[iOS]數據庫第三方框架FMDB詳細講解

[iOS]數據庫第三方框架FMDB詳細講解


初識FMDB


iOS中原生的SQLite API在進行數據存儲的時候,需要使用C語言中的函數,操作比較麻煩。于是,就出現了一系列將SQLite API進行封裝的庫,例如FMDBPlausibleDatabasesqlitepersistentobjects等。

FMDB是一款簡潔、易用的封裝庫。因此,在這里推薦使用第三方框架FMDB,它是對libsqlite3框架的封裝,用起來的步驟與SQLite使用類似,并且它對于多線程的并發操作進行了處理,所以是線程安全的。


FMDB PK Sqlite


  • 優點:
    • 對多線程的并發操作進行處理,所以是線程安全的;
    • 以OC的方式封裝了SQLite的C語言API,使用起來更加的方便;
    • FMDB是輕量級的框架,使用靈活。
  • 缺點:
    • 因為它是OC的語言封裝的,只能在ios開發的時候使用,所以在實現跨平臺操作的時候存在局限性。

FMDB框架中重要的框架類


  • FMDatabase
    • FMDatabase對象就代表一個單獨的SQLite數據庫,用來執行SQL語句
  • FMResultSet
    • 使用FMDatabase執行查詢后的結果集
  • FMDatabaseQueue
    • 用于在多線程中執行多個查詢或更新,它是線程安全的

FMDB使用步驟


  • 下載FMDB文件GitHub,并將FMDB文件夾添加到項目中(也可使用CocoaPods導入)
  • 導入libsqlite3.0框架,導入頭文件FMDatabase.h
  • 代碼實現,與SQLite使用步驟相似,創建數據庫路徑,獲得數據庫路徑,打開數據庫,然后對數據庫進行增、刪、改、查操作,最后關閉數據庫。
step.png
數據庫創建

創建FMDatabase對象時參數為SQLite數據庫文件路徑,該路徑可以是以下三種方式之一

  • 文件路徑。該文件路徑無需真實存在,如果不存在會自動創建

  • 空字符串(@“”)。表示會在臨時目錄創建一個空的數據庫,當FMDatabase連接關閉時,文件也會被刪除

  • NULL。將創建一個內在數據庫,同樣的,當FMDatabase連接關閉時,數據將會被銷毀

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

student.png
數據庫使用FMDB框架代碼操作
  • 使用FMDataBase類建立數據庫

    //1.獲得數據庫文件的路徑
    NSString *doc =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)  lastObject];                  
    
    NSString *fileName = [doc stringByAppendingPathComponent:@“student.sqlite”];
        
    //2.獲得數據庫
    FMDatabase *db = [FMDatabase databaseWithPath:fileName];
    
    //3.使用如下語句,如果打開失敗,可能是權限不足或者資源不足。通常打開完操作操作后,需要調用 close 方法來關閉數據庫。在和數據庫交互 之前,數據庫必須是打開的。如果資源或權限不足無法打開或創建數據庫,都會導致打開失敗。
    if ([db open])
    {
        //4.創表
        BOOL result = [db executeUpdate:@“CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);”];
        if (result)
        {
            NSLog(@“創建表成功”);
        }
    }
    
  • 查看sql表

  • 根據路徑fileName在Finder中搜索.sqlite文件,并復制到桌面

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


    2.png
  • 數據表結構

sql.png

使用FMDataBase類執行數據庫命令SQL

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

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

執行更新返回一個BOOL值。YES表示 執行成功,否則表示有錯誤。你可以調用 -lastErrorMessage 和 -lastErrorCode方法來得到更多信息。


  • 使用FMDataBase類執行數據庫插入命令SQLinsert into

    int age = 42;
    
    //1.executeUpdate:不確定的參數用?來占位(后面參數必須是oc對象,;代表語句結束)
    [self.db executeUpdate:@“INSERT INTO t_student (name, age) VALUES (?,?);”,name,@(age)];
    
    //2.executeUpdateWithForamat:不確定的參數用%@,%d等來占位 (參數為原始數據類型,執行語句不區分大小寫)
    [self.db executeUpdateWithForamat:@“insert into t_student (name,age) values (%@,%i);”,name,age];
         
    //3.參數是數組的使用方式
    [self.db executeUpdate:@“INSERT INTO     
    t_student(name,age) VALUES  (?,?);”withArgumentsInArray:@[name,@(age                 )]];
    
  • 使用FMDataBase類執行數據庫刪除命令SQLdelete

    //1.不確定的參數用?來占位 (后面參數必須是oc對象,需要將int包裝成OC對象)
    int idNum = 101;
    [self.db executeUpdate:@“delete from t_student where id = ?;”,@(idNum)];
    
    //2.不確定的參數用%@,%d等來占位
    [self.db executeUpdateWithFormat:@“delete from t_student where name = %@;”,@“apple_name”];
    
  • 使用FMDataBase類執行數據庫修改命令SQLupdate

    //修改學生的名字
    [self.db executeUpdate:@“update t_student set name = ? where name = ?”,newName,oldName];
    
  • 使用FMDataBase類執行數據庫查詢命令SQLselect ... from

    • SELECT命令就是查詢,執行查詢的方法是以-excuteQuery開頭的。
    • 執行查詢時,如果成功返回FMResultSet對象,錯誤返回nil。與執行更新相當,支持使用NSError參數。
    • 同時,你也可以使用-lastErrorCode和-lastErrorMessage獲知錯誤信息。
  • FMResultSet獲取不同數據格式的方法

  • intForColumn:

  • longForColumn:

  • longLongIntForColumn:

  • boolForColumn:

  • doubleForColumn:

  • stringForColumn:

  • dataForColumn:

  • dataNoCopyForColumn:

  • UTF8StringForColumnIndex:

  • objectForColumn:

  • 使用FMResultSet獲取查詢語句結果

     //查詢整個表
    FMResultSet *resultSet = [self.db executeQuery:@“select * from t_student;”];
     
     //根據條件查詢
    FMResultSet *resultSet = [self.db executeQuery:@“select * from t_student where id<?;”@(14)];
    
     //遍歷結果集合   
      
    while ([resultSet  next])
     
      {
        int idNum = [resultSet intForColumn:@“id”];
    
        NSString *name = [resultSet    
        objectForColumn:@“name”];
       
        int age = [resultSet intForColumn:@“age”];
      }
          
    
  • 使用FMDataBase類執行數據庫銷毀命令SQLdrop ...

    //如果表格存在 則銷毀
    [self.db executeUpadate:@“drop table if exists t_student;”];
    
  • 使用FMDatabaseQueue類實現多線程操作

在多個線程中同時使用一個FMDatabase實例是不明智的。現在你可以為每 個線程創建一個FMDatabase對象,不要讓多個線程分享同一個實例,他無 法在多個線程中同事使用。否則程序會時不時崩潰或者報告異常。所以,不要 初始化FMDatabase對象,然后在多個線程中使用。這時候,我們就需要使 用FMDatabaseQueue來創建隊列執行事務。

 //1.創建隊列
 FMDatabaseQueue *queue = [FMDatabaseQueue   
 databaseQueueWithPath:aPath];
  __block BOOL whoopsSomethingWrongHappened = true;
  
 //2.把任務包裝到事務里
 [queue inTransaction:^(FMDatabase *db, BOOL *rollback) 
  {  
 whoopsSomethingWrongHappened &=  [db     executeUpdate:@“INSERT INTO myTable VALUES (?)”,    [NSNumber numberWith:1]];
whoopsSomethingWrongHappened &= [db
executeUpdata:@“INSERT INTO myTable VALUES (?)”, 
[NSNumber numberWithInt:2]];

whoopsSomethingWrongHappened &= [db  
executeUpdata:@“INSERT INTO myTable VALUES (?)”[NSNumber  
numberWithInt:3]];
//如果有錯誤 返回
if (!whoopsSomethingWrongHappened)
  { 
    *rollback = YES;
      return;
  }
}];

好了,到此為止,相信你已經能夠使用FMDB進行數據持久化了,它的好與壞 只有在不斷地使用過程中才能發現了解。所以,希望大家學會了以后還是要多  寫多練多使用。另外,誠心希望大家多提寶貴意見,或者溝通一些好的想法。^^
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容