iOS第三方之FMDB
FMDB有三個主要的類
1.FMDatabase – 表示一個單獨(dú)的SQLite數(shù)據(jù)庫。 用來執(zhí)行SQLite的命令。
2.FMResultSet – 表示FMDatabase執(zhí)行查詢后結(jié)果集
3.FMDatabaseQueue – 如果你想在多線程中執(zhí)行多個查詢或更新,你應(yīng)該使用該類。這是線程安全的。
數(shù)據(jù)庫創(chuàng)建
創(chuàng)建FMDatabase對象時(shí)參數(shù)為SQLite數(shù)據(jù)庫文件路徑。該路徑可以是以下三種之一:
1..文件路徑。該文件路徑無需真實(shí)存,如果不存在會自動創(chuàng)建。
2..空字符串(@”")。表示會在臨時(shí)目錄創(chuàng)建一個空的數(shù)據(jù)庫,當(dāng)FMDatabase 鏈接關(guān)閉時(shí),文件也被刪除。
3.NULL. 將創(chuàng)建一個內(nèi)在數(shù)據(jù)庫。同樣的,當(dāng)FMDatabase連接關(guān)閉時(shí),數(shù)據(jù)會被銷毀。
如需對臨時(shí)數(shù)據(jù)庫或內(nèi)在數(shù)據(jù)庫進(jìn)行一步了解,請繼續(xù)閱讀:點(diǎn)擊打開鏈接
打開數(shù)據(jù)庫
在和數(shù)據(jù)庫交互 之前,數(shù)據(jù)庫必須是打開的。如果資源或權(quán)限不足無法打開或創(chuàng)建數(shù)據(jù)庫,都會導(dǎo)致打開
- <pre name="code" class="objc"> if (![_db open]) {
- NSLog(@"數(shù)據(jù)庫打開失敗");
- return NO;
- }
執(zhí)行更新
一切不是SELECT命令的命令都視為更新。這包括 CREATE, UPDATE, INSERT,ALTER,COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE (等)。
簡單來說,只要不是以SELECT開頭的命令都是UPDATE命令。
執(zhí)行更新返回一個BOOL值。YES表示執(zhí)行成功,否則表示有那些錯誤 。你可以調(diào)用 -lastErrorMessage 和 -lastErrorCode方法來得到更多信息。
舉個例子:插入一個Student數(shù)據(jù)
- // 兩種寫sql語句方式
- NSString *sqlStr = [NSString stringWithFormat:@"insert into student values ('%@', '%@', '%@')", student.number, student.name, student.age];
- NSLog(@"%@", sqlStr);
- BOOL result = [_db executeUpdate:sqlStr];<pre name="code" class="objc" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 25px;">// BOOL result = [_db executeUpdate:@"insert into student (number, name, age) values (?,?,?)", student.number, student.name, student.age];
- [self judgeDBError:result action:DATABASE_INSERT]; return result;
- /**
- * 打印執(zhí)行SQL語句的狀態(tài)
- *
- * @param judge SQL語句的執(zhí)行:成功(YES)/失敗(NO)
- * @param action SQL語句的相關(guān)操作:創(chuàng)建/插入/查詢/刪除
- */
- -(void)judgeDBError:(BOOL)judge action:(NSString *)action
- {
- if (!judge && [self.db hadError]) {
- //如果有錯誤,打印錯誤信息
- NSLog(@"%@失敗:%@",action,[self.db lastError]);
- }
- else
- {
- NSLog(@"%@成功",action);
- }
- }
執(zhí)行查詢
SELECT命令就是查詢,執(zhí)行查詢的方法是以 -excuteQuery開頭的。
執(zhí)行查詢時(shí),如果成功返回FMResultSet對象, 錯誤返回nil. 與執(zhí)行更新相當(dāng),支持使用 NSError**參數(shù)。同時(shí),你也可以使用 -lastErrorCode和-lastErrorMessage獲知錯誤信息。
- FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];
- while ([s next]) {
- //retrieve values for each record
- }
舉個例子:
- -(NSMutableArray *)selectAllStudents
- {
- FMResultSet *set = [_db executeQuery:@"select * from student"];
- return [self selectAllStudentsHelper:set];
- }
為了數(shù)據(jù)查找的通用性,寫了一個通用方法查找Student數(shù)據(jù)
- (NSMutableArray *)selectAllStudentsHelper:(FMResultSet *)FMSet;
- -(NSMutableArray *)selectAllStudentsHelper:(FMResultSet *)FMSet
- {
- NSMutableArray * selectResult = [NSMutableArray array];
- while ([FMSet next]) {
- Student * stu = [[Student alloc] init];
- stu.number = [FMSet stringForColumn:@"number"];
- stu.name = [FMSet stringForColumn:@"name"];
- stu.age = [FMSet stringForColumn:@"age"];
- /**
- * 各種不同類型的值有不同的取法.
- * int a = [FMSet intForColumn:@"a"],
- * NSString * b = [FMSet stringForColumn:@"b"],
- * NSData * c = [FMSet dateForColumn:@"c"],
- * float d = [FMSet doubleForColumn:@"d"],
- */
- [selectResult addObject:stu];
- }
- return selectResult;
- }
FMResultSet 提供了很多方法來獲得所需的格式的值:
intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumnIndex:
objectForColumn:
本文鏈接:http://my.oschina.net/CgShare/blog/293635