FMDB


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

FMDB是一款簡潔、易用的封裝庫。因此,在這里推薦使用第三方框架FMDB,它是對libsqlite3框架的封裝,用起來的步驟與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使用步驟相似,創建數據庫路徑,獲得數據庫路徑,打開數據庫,然后對數據庫進行增、刪、改、查操作,最后關閉數據庫。


 

使用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:

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)]];

刪除命令SQL:

//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”];

修改命令SQL:

//修改學生的名字
  [self.db executeUpdate:@“update t_student set name = ? where name = ?”,newName,oldName];

 

查詢:

FMResultSet獲取不同數據格式的方法

  • intForColumn:
  • longForColumn:
  • longLongIntForColumn:
  • boolForColumn:
  • doubleForColumn:
  • stringForColumn:
  • dataForColumn:
  • dataNoCopyForColumn:
  • UTF8StringForColumnIndex:
  • objectForColumn:
//查詢整個表
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”];
  }

銷毀命令SQL

//如果表格存在 則銷毀
  [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;
  }
}];

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM