FMDB有三個(gè)主要的類
1.FMDatabase – 表示一個(gè)單獨(dú)的SQLite數(shù)據(jù)庫(kù)。 用來(lái)執(zhí)行SQLite的命令。
2.FMResultSet – 表示FMDatabase執(zhí)行查詢后結(jié)果集
3.FMDatabaseQueue – 如果你想在多線程中執(zhí)行多個(gè)查詢或更新,你應(yīng)該使用該類。這是線程安全的。
數(shù)據(jù)庫(kù)創(chuàng)建
創(chuàng)建FMDatabase對(duì)象時(shí)參數(shù)為SQLite數(shù)據(jù)庫(kù)文件路徑。
FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
打開(kāi)數(shù)據(jù)庫(kù)
在和數(shù)據(jù)庫(kù)交互 之前,數(shù)據(jù)庫(kù)必須是打開(kāi)的。如果資源或權(quán)限不足無(wú)法打開(kāi)或創(chuàng)建數(shù)據(jù)庫(kù),都會(huì)導(dǎo)致打開(kāi)失敗。
if (![db open]) {
[db release];
return;
}
執(zhí)行更新
一切不是SELECT命令的命令都視為更新。這包括 CREATE, UPDATE, INSERT,ALTER,COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE (等)。
簡(jiǎn)單來(lái)說(shuō),只要不是以SELECT開(kāi)頭的命令都是UPDATE命令。
執(zhí)行更新返回一個(gè)BOOL值。YES表示執(zhí)行成功,否則表示有那些錯(cuò)誤 。你可以調(diào)用 -lastErrorMessage 和 -lastErrorCode方法來(lái)得到更多信息。
執(zhí)行查詢
SELECT命令就是查詢,執(zhí)行查詢的方法是以 -excuteQuery開(kāi)頭的。
執(zhí)行查詢時(shí),如果成功返回FMResultSet對(duì)象, 錯(cuò)誤返回nil. 與執(zhí)行更新相當(dāng),支持使用 NSError**參數(shù)。同時(shí),你也可以使用 -lastErrorCode和-lastErrorMessage獲知錯(cuò)誤信息。
為了遍歷查詢結(jié)果,你可以使用while循環(huán)。你還需要知道怎么跳到下一個(gè)記錄。使用FMDB,很簡(jiǎn)單實(shí)現(xiàn),就像這樣:
FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];
while ([s next]) {
//retrieve values for each record
}
關(guān)閉數(shù)據(jù)庫(kù)
當(dāng)使用完數(shù)據(jù)庫(kù),你應(yīng)該 -close 來(lái)關(guān)閉數(shù)據(jù)庫(kù)連接來(lái)釋放SQLite使用的資源。
[db close];
FMDatabase是支持事務(wù)的。
使用FMDatabaseQueue 及線程安全
在多個(gè)線程中同時(shí)使用一個(gè)FMDatabase實(shí)例是不明智的。現(xiàn)在你可以為每個(gè)線程創(chuàng)建一個(gè)FMDatabase對(duì)象。 不要讓多個(gè)線程分享同一個(gè)實(shí)例,它無(wú)法在多個(gè)線程中同時(shí)使用。 若此,壞事會(huì)經(jīng)常發(fā)生,程序會(huì)時(shí)不時(shí)崩潰,或者報(bào)告異常,或者隕石會(huì)從天空中掉下來(lái)砸到你Mac Pro. 總之很崩潰。所以,不要初始化FMDatabase對(duì)象,然后在多個(gè)線程中使用。請(qǐng)使用 FMDatabaseQueue,它是你的朋友而且會(huì)幫助你。以下是使用方法:
首先創(chuàng)建隊(duì)列
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]) {
…
}
}];
像這樣,輕松地把簡(jiǎn)單任務(wù)包裝到事務(wù)里:
[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]];
}];