FMDB 官方使用文件

2021-07-27 03:54:23 字數 4905 閱讀 7409

來自會員

pengtao

的分享:(原文:

)由於fmdb是建立在sqlite的之上的,所以你至少也該把這篇文章從頭到尾讀一遍。與此同時,把sqlite的文件頁 加到你的書籤中。自動引用計數(apc)還是手動記憶體管理呢?

兩種都行,fmdb會在編譯的時候知道你是用的哪一種,然後進行相應處理。

使用方法

fmdb有三個主要的類

1.fmdatabase – 表示乙個單獨的sqlite資料庫。 用來執行sqlite的命令。

2.fmresultset – 表示fmdatabase執行查詢後結果集

3.fmdatabasequeue – 如果你想在多執行緒中執行多個查詢或更新,你應該使用該類。這是執行緒安全的。

資料庫建立

建立fmdatabase物件時引數為sqlite資料庫檔案路徑。該路徑可以是以下三種之一:

1..檔案路徑。該檔案路徑無需真實存,如果不存在會自動建立。

2..空字串(@」")。表示會在臨時目錄建立乙個空的資料庫,當fmdatabase 鏈結關閉時,檔案也被刪除。

3.null. 將建立乙個內在資料庫。同樣的,當fmdatabase連線關閉時,資料會被銷毀。

fmdatabase *db = [fmdatabase databasewithpath:@

"/tmp/tmp.db"

];   

開啟資料庫

在和資料庫互動 之前,資料庫必須是開啟的。如果資源或許可權不足無法開啟或建立資料庫,都會導致開啟失敗。

if

(![db open])   

執行更新

一切不是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])    

你必須一直呼叫   -[fmresultset next]   在你訪問查詢返回值之前,甚至你只想要乙個記錄:

fmresultset *s = [db executequery:@

"select count(*) from mytable"

];   

if([s next])    

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

intforcolumn:

longforcolumn:

longlongintforcolumn:

boolforcolumn:

doubleforcolumn:

stringforcolumn:

dataforcolumn:

datanocopyforcolumn:

utf8stringforcolumnindex:

objectforcolumn:

這些方法也都包括 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)     

}];   

像這樣,輕鬆地把簡單任務包裝到事務裡:

[queue intransaction:^(fmdatabase *db, bool *rollback)    

// etc…   

[db executeupdate:@"insert into mytable values (?)"

, [nsnumber numberwithint:4]];    

}];   

fmdatabasequeue  後台會建立系列化的g-c-d佇列,並執行你傳給g-c-d佇列的塊。這意味著 你從多執行緒同時呼叫呼叫方法,gdc也會按它接收的塊的順序來執行。誰也不會吵到誰的腳 ,每個人都幸福。

原文:

TRUNCATE 使用之MySQL官方文件說明

翻譯目的 自己的另一篇博文準備引用 13.1.33 truncate table syntax truncate table tbl name truncate table完全清空一張表,該操作需要使用者具有刪除表的許可權 drop privilege 邏輯上來說,truncate table 相較...

《KAFKA官方文件》使用場景

以下是apache kafka 的一些常見使用場景的描述。有關這些實踐領域的一些概述,請參閱此博文。kafka被當作傳統訊息中介軟體的替代品。訊息中介軟體的使用原因有多種 從資料生產者解耦處理,快取未處理的訊息等 與大多數訊息系統相比,kafka具有更好的吞吐量,內建的分割槽,多副本和容錯功能,這使...

kvm官方文件

kvm官方文件 kvm活遷移 使用libvirt庫建立虛擬機器 domain 需要使用xml檔案作為配置檔案,如下是乙個最基本的虛擬機器配置檔案.2014 07 01 20 50 閱讀 233 在使用qemu建立虛擬機器的過程中是無法指定ip位址的,可是在實際應用中,我們是需要虛擬機器擁有ip位址的...