來自會員
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:@正確有做法是把數字打包成 nsnumber物件"insert into mytable values (?)"
, 42];
[db executeupdate:@或者,你可以使用 -execute*withformat: ,這是nsstring風格的引數"insert into mytable values (?)"
, [nsnumber numberwithint:42]];
[db executeupdatewithformat:@-execute*withformat: 的方法的內部實現會幫你封裝資料, 以下這些修飾符都可以使用: %@, %c, %s, %d, %d,%i, %u, %u, %hi, %hu, %qi, %qu, %f, %g, %ld, %lu, %lld, and %llu. 除此之外的修飾符可能導致無法預知的結果。 一些情況下,你需要在sql語句中使用 % 字元,你應該使用 %%。"insert into mytable values (%d)"
, 42];
使用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位址的...