[iOS]資料庫第三方架構FMDB詳細講解

來源:互聯網
上載者:User

標籤:資料存放區   sqlite   format   集合   開啟   column   Null 字元串   nsnumber   表結構   

[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資料庫檔案路徑,該路徑可以是以下三種方式之一

  • 檔案路徑。該檔案路徑無需真實存在,如果不存在會自動建立
  • Null 字元串(@“”)。表示會在臨時目錄建立一個空的資料庫,當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 AUTOINCREM ENT, name text NOT NULL, age integer NOT NULL);”];       if (result)        {          NSLog(@“建立表成功”);        }  }
  • 查看sql表
    • 根據路徑fileName在Finder中搜尋.sqlite檔案,並複製到案頭
    • 使用Firefox瀏覽器工具下的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 execute Query:@“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 &= [dbexecuteUpdata:@“INSERT INTO myTable VALUES (?)”, [NSNumber numberWithInt:2]];whoopsSomethingWrongHappened &= [db  executeUpdata:@“INSERT INTO myTable VALUES (?)”[NSNumber  numberWithInt:3]];//如果有錯誤 返回if (!whoopsSomethingWrongHappened)  {     *rollback = YES;      return;  }}];

    好了,到此為止,相信你已經能夠使用FMDB進行資料持久化了,它的好與壞 只有在不斷地使用過程中才能發現瞭解。所以,希望大家學會了以後還是要多 寫多練多使用。另外,誠心希望大家多提寶貴意見,或者溝通一些好的想法。^^



文/陳向陽哈(簡書作者)
原文連結:http://www.jianshu.com/p/e2dbd69b6db2
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。

[iOS]資料庫第三方架構FMDB詳細講解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.