日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS FMDB官方使用文档 G-C-D的使用 提高性能(翻译)(转)

發布時間:2024/4/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS FMDB官方使用文档 G-C-D的使用 提高性能(翻译)(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于FMDB是建立在SQLite的之上的,所以你至少也該把這篇文章從頭到尾讀一遍。
與此同時,把SQLite的文檔頁?http://www.sqlite.org/docs.html?加到你的書簽中。
自動引用計數(APC)還是手動內存管理呢?

兩種都行,FMDB會在編譯的時候知道你是用的哪一種,然后進行相應處理。
使用方法

FMDB有三個主要的類

????FMDatabase – 表示一個單獨的SQLite數據庫。 用來執行SQLite的命令。
????FMResultSet – 表示FMDatabase執行查詢后結果集
????FMDatabaseQueue – 如果你想在多線程中執行多個查詢或更新,你應該使用該類。這是線程安全的。

數據庫創建

創建FMDatabase對象時參數為SQLite數據庫文件路徑。該路徑可以是以下三種之一:
文件路徑。該文件路徑無需真實存,如果不存在會自動創建。
空字符串(@”")。表示會在臨時目錄創建一個空的數據庫,當FMDatabase 鏈接關閉時,文件也被刪除。
NULL. 將創建一個內在數據庫。同樣的,當FMDatabase連接關閉時,數據會被銷毀。
(如需對臨時數據庫或內在數據庫進行一步了解,請繼續閱讀:http://www.sqlite.org/inmemorydb.html)


????FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];??

打開數據庫

在和數據庫交互 之前,數據庫必須是打開的。如果資源或權限不足無法打開或創建數據庫,都會導致打開失敗。


????if (![db open]) {???
????????[db release];??
????????return;???
????}???

執行更新

一切不是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,很簡單實現,就像這樣:


????FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];??
????while ([s next]) {??
????????//retrieve values for each record??
????}??

你必須一直調用?? -[FMResultSet next]?? 在你訪問查詢返回值之前,甚至你只想要一個記錄:



????FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];??
????if ([s next]) {???
???????? int totalCount = [s intForColumnIndex:0];??
????}??

FMResultSet??提供了很多方法來獲得所需的格式的值:

????intForColumn:
????longForColumn:
????longLongIntForColumn:
????boolForColumn:
????doubleForColumn:
????stringForColumn:
????dataForColumn:
????dataNoCopyForColumn:
????UTF8StringForColumnIndex:
????objectForColumn:

這些方法也都包括 {type}ForColumnIndex 的這樣子的方法,參數是查詢結果集的列的索引位置。

你無需調用??[FMResultSet close]來關閉結果集, 當新的結果集產生,或者其數據庫關閉時,會自動關閉。
關閉數據庫

當使用完數據庫,你應該 -close 來關閉數據庫連接來釋放SQLite使用的資源。

????[db close];??

事務

FMDatabase是支持事務的。
數據凈化(數據格式化)

使用FMDB,插入數據前,你不要花時間審查你的數據。你可以使用標準的SQLite數據綁定語法。

????INSERT INTO myTable VALUES (?, ?, ?)??

SQLite會識別 “?” 為一個輸入的點位符, 這樣的執行會接受一個可變參數(或者表示為其他參數,如NSArray, NSDictionary,或va_list等),會正確為您轉義。
你也可以選擇使用命名參數語法。

????INSERT INTO myTable VALUES (:id, :name, :value)??

參數名必須以冒名開頭。SQLite本身支持其他字符,當Dictionary key的內部實現是冒號開頭。注意你的NSDictionary key不要包含冒號。


????NSDictionary *argsDict = [NSDictionary dictionaryWithObjectsAndKeys:@"My Name", @"name", nil];???
????[db executeUpdate:@"INSERT INTO myTable (name) VALUES (:name)" withParameterDictionary:argsDict];??

而且,代碼不能這么寫(為什么?想想吧。)


[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @"this has \" lots of ' bizarre \" quotes '"];

你應該:


????[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @"this has " lots of ' bizarre " quotes '"];??

提供給 -executeUpdate: 方法的參數都必須是對象。就像以下的代碼就無法工作,且會產生崩潰。


????[db executeUpdate:@"INSERT INTO myTable VALUES (?)", 42];??

正確有做法是把數字打包成 NSNumber對象


????[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:42]];??

或者,你可以使用??-execute*WithFormat: ,這是NSString風格的參數


????[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,它是你的朋友而且會幫助你。以下是使用方法:
首先創建隊列。
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]];???
??????????????[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];??
??????????????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 (whoopsSomethingWrongHappened) {???
????????????????????*rollback = YES; return;???
????????????}??
????????????// etc…???
????????????[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];???
????}];??

FMDatabaseQueue??后臺會建立系列化的G-C-D隊列,并執行你傳給G-C-D隊列的塊。這意味著 你從多線程同時調用調用方法,
GDC也會按它接收的塊的順序來執行。誰也不會吵到誰的腳 ,每個人都幸福。

轉載于:https://www.cnblogs.com/weiboyuan/p/4071331.html

總結

以上是生活随笔為你收集整理的iOS FMDB官方使用文档 G-C-D的使用 提高性能(翻译)(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。