iOS:轉載FMDB文檔

來源:互聯網
上載者:User

標籤:

來自會員pengtao的分享:(原文:https://github.com/ccgus/fmdb)由於FMDB是建立在SQLite的之上的,所以你至少也該把這篇文章從頭到尾讀一遍。與此同時,把SQLite的文檔頁 加到你的書籤中。自動引用計數(APC)還是手動記憶體管理呢?兩種都行,FMDB會在編譯的時候知道你是用的哪一種,然後進行相應處理。使用方法FMDB有三個主要的類1.FMDatabase – 表示一個單獨的SQLite資料庫。 用來執行SQLite的命令。2.FMResultSet – 表示FMDatabase執行查詢後結果集3.FMDatabaseQueue – 如果你想在多線程中執行多個查詢或更新,你應該使用該類。這是安全執行緒的。資料庫建立建立FMDatabase對象時參數為SQLite資料庫檔案路徑。該路徑可以是以下三種之一:1..檔案路徑。該檔案路徑無需真實存,如果不存在會自動建立。2..Null 字元串(@”")。表示會在臨時目錄建立一個空的資料庫,當FMDatabase 連結關閉時,檔案也被刪除。3.NULL. 將建立一個內在資料庫。同樣的,當FMDatabase串連關閉時,資料會被銷毀。(如需對臨時資料庫或內在資料庫進行一步瞭解,請繼續閱讀:http://www.sqlite.org/inmemorydb.html)
  1. FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];   
開啟資料庫在和資料庫互動 之前,資料庫必須是開啟的。如果資源或許可權不足無法開啟或建立資料庫,都會導致開啟失敗。
  1. if (![db open]) {    
  2.         [db release];   
  3.         return;    
  4.     }  
執行更新一切不是SELECT命令的命令都視為更新。這包括  CREATE, UPDATE, INSERT,ALTER,COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE  (等)。簡單來說,只要不是以SELECT開頭的命令都是UPDATE命令。執行更新返回一個BOOL值。YES表示執行成功,否則表示有那些錯誤 。你可以調用 -lastErrorMessage 和 -lastErrorCode方法來得到更多資訊。執行查詢SELECT命令就是查詢,執行查詢的方法是以 -excuteQuery開頭的。執行查詢時,如果成功返回FMResultSet對象, 錯誤返回nil. 與執行更新相當,支援使用 NSError**參數。同時,你也可以使用 -lastErrorCode和-lastErrorMessage獲知錯誤資訊。為了遍曆查詢結果,你可以使用while迴圈。你還需要知道怎麼跳到下一個記錄。使用FMDB,很簡單實現,就像這樣:
  1. FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];   
  2. while ([s next]) {   
  3.     //retrieve values for each record   
  4. }   
你必須一直調用   -[FMResultSet next]   在你訪問查詢傳回值之前,甚至你只想要一個記錄:
  1. FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];   
  2.   if ([s next]) {    
  3.        int totalCount = [s intForColumnIndex:0];   
  4.   }   
FMResultSet  提供了很多方法來獲得所需的格式的值:    intForColumn:    longForColumn:    longLongIntForColumn:    boolForColumn:    doubleForColumn:    stringForColumn:    dataForColumn:    dataNoCopyForColumn:    UTF8StringForColumnIndex:    objectForColumn:這些方法也都包括 {type}ForColumnIndex 的這樣子的方法,參數是查詢結果集的列的索引位置。你無需調用  [FMResultSet close]來關閉結果集, 當新的結果集產生,或者其資料庫關閉時,會自動關閉。關閉資料庫當使用完資料庫,你應該 -close 來關閉資料庫連接來釋放SQLite使用的資源。    [db close];  事務FMDatabase是支援事務的。資料淨化(資料格式化)使用FMDB,插入資料前,你不要花時間審查你的資料。你可以使用標準的SQLite資料繫結文法。
  1. INSERT INTO myTable VALUES (?, ?, ?)   
SQLite會識別 “?” 為一個輸入的點位符, 這樣的執行會接受一個可變參數(或者表示為其他參數,如NSArray, NSDictionary,或va_list等),會正確為您轉義。你也可以選擇使用具名引數文法。
  1. INSERT INTO myTable VALUES (:id, :name, :value)   
參數名必須以冒名開頭。SQLite本身支援其他字元,當Dictionary key的內部實現是冒號開頭。注意你的NSDictionary key不要包含冒號。
  1. NSDictionary *argsDict = [NSDictionary dictionaryWithObjectsAndKeys:@"My Name", @"name", nil];    
  2.     [db executeUpdate:@"INSERT INTO myTable (name) VALUES (:name)" withParameterDictionary:argsDict];   
而且,代碼不能這麼寫(為什嗎?想想吧。)
  1. [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @"this has \" lots of ‘ bizarre \" quotes ‘"]; 
你應該:
  1. [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @"this has " lots of ‘ bizarre " quotes ‘"];   
提供給 -executeUpdate: 方法的參數都必須是對象。就像以下的代碼就無法工作,且會產生崩潰。
  1. [db executeUpdate:@"INSERT INTO myTable VALUES (?)", 42];   
 正確有做法是把數字打包成 NSNumber對象
  1. [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:42]];   
或者,你可以使用  -execute*WithFormat: ,這是NSString風格的參數
  1. [db executeUpdateWithFormat:@"INSERT INTO myTable VALUES (%d)", 42];   
 -execute*WithFormat:  的方法的內部實現會幫你封裝資料, 以下這些修飾符都可以使用: %@, %c, %s, %d, %D,%i, %u, %U, %hi, %hu, %qi, %qu, %f, %g, %ld, %lu, %lld, and %llu.  除此之外的修飾符可能導致無法預知的結果。 一些情況下,你需要在SQL語句中使用 % 字元,你應該使用 %%。使用FMDatabaseQueue 及安全執行緒在多個線程中同時使用一個FMDatabase執行個體是不明智的。現在你可以為每個線程建立一個FMDatabase對象。 不要讓多個線程分享同一個執行個體,它無法在多個線程中同時使用。 若此,壞事會經常發生,程式會時不時崩潰,或者報告異常,或者隕石會從天空中掉下來砸到你Mac Pro.  總之很崩潰。所以,不要初始化FMDatabase對象,然後在多個線程中使用。請使用 FMDatabaseQueue,它是你的朋友而且會協助你。以下是使用方法:首先建立隊列。
  1. FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath]; 
這樣使用。
  1. [queue inDatabase:^(FMDatabase *db) {    
  2.           [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];    
  3.           [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];    
  4.           [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];    
  5.           FMResultSet *rs = [db executeQuery:@"select * from foo"];    
  6.          while([rs next]) {   
  7.             …    
  8.          }    
  9. }];   
像這樣,輕鬆地把簡單任務封裝到事務裡:
  1. [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {    
  2.             [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];    
  3.             [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];    
  4.             [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];    
  5.             if (whoopsSomethingWrongHappened) {    
  6.                     *rollback = YES; return;    
  7.             }   
  8.             // etc…    
  9.             [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];    
  10.     }];   
 FMDatabaseQueue  後台會建立系列化的G-C-D隊列,並執行你傳給G-C-D隊列的塊。這意味著 你從多線程同時調用調用方法,GDC也會按它接收的塊的順序來執行。誰也不會吵到誰的腳 ,每個人都幸福。原文:http://www.cocoachina.com/bbs/read.php?tid=140901

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.