你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發之FMDB

iOS開發之FMDB

編輯:IOS開發綜合
sqlite作為一個輕量級的數據庫,由於它占用的內存很少,因此在很多的嵌入式設備中得到廣泛的使用。iOS的SDK很早就開始支持了SQLite,我們只需要加入 libsqlite3.dylib 以及引入 sqlite3.h 頭文件即可,但由於原生sqlite的API不是很友好,因此使用的話一般會對其做一層封裝,其中以開源的FMDB最為流行。   FMDB主要的類 1.FMDatabase – 表示一個單獨的SQLite數據庫。 用來執行SQLite的命令。   2.FMResultSet – 表示FMDatabase執行查詢後結果集   3.FMDatabaseQueue – 當你在多線程中執行操作,使用該類能確保線程安全。       FMDB的使用 數據庫的創建:   創建FMDatabase對象時需要參數為SQLite數據庫文件路徑。該路徑可以是以下三種之一:   1..文件路徑。該文件路徑無需真實存,如果不存在會自動創建。   2..空字符串(@”")。表示會在臨時目錄創建一個臨時數據庫,當FMDatabase 鏈接關閉時,文件也被刪除。   3.NULL. 將創建一個內存數據庫。同樣的,當FMDatabase連接關閉時,數據會被銷毀。   內存數據庫:     通常數據庫是存放在磁盤當中的。然而我們也可以讓存放在內存當中的數據庫,內存數據庫的優點是對其操作的速度較快,畢竟訪問內存的耗時低於訪問磁盤,但內存數據庫有如下缺陷:由於內存數據庫沒有被持久化,當該數據庫被關閉後就會立刻消失,斷電或程序崩潰都會導致數據丟失;不支持讀寫互斥處理,需要自己手動添加鎖;無法被別的進程訪問。   臨時數據庫:     臨時數據庫和內存數據庫非常相似,兩個數據庫連接創建的臨時數據庫也是各自獨立的,在連接關閉後,臨時數據庫將自動消失,其底層文件也將被自動刪除。盡管磁盤文件被創建用於存儲臨時數據庫中的數據信息,但是實際上臨時數據庫也會和內存數據庫一樣通常駐留在內存中,唯一不同的是,當臨時數據庫中數據量過大時,SQLite為了保證有更多的內存可用於其它操作,因此會將臨時數據庫中的部分數據寫到磁盤文件中,而內存數據庫則始終會將數據存放在內存中。       創建數據庫:FMDatabase *db= [FMDatabase databaseWithPath:dbPath] ;   在進行數據庫的操作之前,必須要先把數據庫打開,如果資源或權限不足無法打開或創建數據庫,都會導致打開失敗。   如下為創建和打開數據庫的示例:   復制代碼 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDirectory = [paths objectAtIndex:0];   //dbPath: 數據庫路徑,存放在Document中。 NSString *dbPath = [documentDirectory stringByAppendingPathComponent:@"MYTest.db"];   //創建數據庫實例 db  這裡說明下:如果路徑中不存在"MYTest.db"的文件,sqlite會自動創建"MYTest.db" FMDatabase *db= [FMDatabase databaseWithPath:dbPath] ; if (![db open]) { NSLog(@"Could not open db."); return ; } 復制代碼     更新操作   一切不是SELECT命令都視為更新操作,包括CREATE, UPDATE, INSERT,ALTER,COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM和REPLACE等。    創建表:   [db executeUpdate:@"CREATE TABLE myTable (Name text,Age integer)"];   插入   [db executeUpdate:@"INSERT INTO myTable (Name,Age) VALUES (?,?)",@"jason",[NSNumber numberWithInt:20]];   更新   [db executeUpdate:@"UPDATE myTable SET Name = ? WHERE Name = ? ",@"john",@"jason"];.   刪除   [db executeUpdate:@"DELETE FROM myTable WHERE Name = ?",@"jason"];   查詢操作   SELECT命令就是查詢,執行查詢的方法是以 -excuteQuery開頭的。執行查詢時,如果成功返回FMResultSet對象, 錯誤返回nil. 讀取信息的時候需要用while循環:   FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];    while ([s next]) {        //從每條記錄中提取信息   }        關閉數據庫   當使用完數據庫,你應該 -close 來關閉數據庫連接來釋放SQLite使用的資源。    [db close];     參數   通常情況下,你可以按照標准的SQL語句,用?表示執行語句的參數,如:   INSERT INTO myTable VALUES (?, ?, ?)   然後,可以我們可以調用executeUpdate方法來將?所指代的具體參數傳入,通常是用變長參數來傳遞進去的,如下:   NSString *sql = @"insert into myTable (name, password) values (?, ?)"; [db executeUpdate:sql, user.name, user.password]; 這裡需要注意的是,參數必須是NSObject的子類,所以象int,double,bool這種基本類型,需要進行相應的封裝   [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:42]];       多線程操作     由於FMDatabase對象本身不是線程安全的,因此為了避免在多線程操作的時候出錯,需要使用 FMDatabaseQueue來執行相關操作。只需要利用一個數據庫文件地址來初使化FMDatabaseQueue,然後傳入一個block到inDatabase中,即使是多個線程同時操作,該queue也會確保這些操作能按序進行,保證線程安全。   創建隊列:   FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];    使用方法:   復制代碼 [queue inDatabase:^(FMDatabase *db) {     [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];     [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];       FMResultSet *rs = [db executeQuery:@"select * from foo"];             while([rs next]) {                …             }     }];   復制代碼 至於事務可以像這樣處理:   復制代碼 [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {         [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];       [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];         [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];          if (somethingWrongHappened) {          *rollback = YES;          return;                 }                // etc…         [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];         }];           
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved