準(zhǔn)備工作
在當(dāng)前類的延展中聲明一個(gè)數(shù)據(jù)庫的對(duì)象
@interface RootViewController ()
@property (strong, nonatomic)FMDatabase *db;
@end
創(chuàng)建一個(gè)數(shù)據(jù)庫的路徑
- (NSString *)dbPath{
NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES)firstObject] stringByAppendingPathComponent:@"FMDB.sqlite"];
return dbPath;
}
打開或者創(chuàng)建一個(gè)數(shù)據(jù)庫
- (FMDatabase *)openOrCreate{
//創(chuàng)建數(shù)據(jù)庫對(duì)象
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
self.db = [FMDatabase databaseWithPath:[self dbPath]];
});
if ([self.db open]) {
return self.db;
}else {
NSLog(@"打開失敗");
return nil;
}
}
FMDB之無返回結(jié)果集
一切不是SELECT命令的命令都視為更新。這包括 CREATE, UPDATE, INSERT,ALTER,COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE (等)。簡(jiǎn)單來說,只要不是以SELECT開頭的命令都是UPDATE命令,也就是無返回結(jié)果集。
示例代碼
- (BOOL)opertationNoResultWithSql:(NSString *)sql operationTag:(NSString *)tag{
//打開數(shù)據(jù)庫
FMDatabase *db = [self openOrCreate];
//執(zhí)行非查詢操作
BOOL isSuccess = [db executeUpdate:sql];
//當(dāng)操作完成后,關(guān)閉數(shù)據(jù)路
[self.db close];
if (isSuccess) {
NSLog(@"%@操作成功",tag);
return YES;
}else{
NSLog(@"%@操作失敗",tag);
return NO;
}
}
FMDB之有返回結(jié)果集
- SELECT命令就是查詢,執(zhí)行查詢的方法是以 -excuteQuery開頭的。
- 執(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)。
示例代碼
- (NSArray *)queryWithSql:(NSString *)sql{
//打開數(shù)據(jù)庫
FMDatabase *db = [self openOrCreate];
//執(zhí)行sql語句,將返回結(jié)果先暫存到resultSet中
FMResultSet *resultSet = [db executeQuery:sql];
//從resultSet中取出每一條記錄
NSMutableArray *array = [NSMutableArray array];
while ([resultSet next]) {//next:判斷sqlite3_step(stament) == row
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
/*每次執(zhí)行while循環(huán)的時(shí)候,都是一個(gè)新的記錄被取出,所以我們需要一個(gè)新的字典來盛放新的記錄,
所以每次進(jìn)while循環(huán)的時(shí)候都需要構(gòu)建一個(gè)新的字典對(duì)象。*/
NSString *name = [resultSet stringForColumn:@"name"];
NSString *gender = [resultSet stringForColumn:@"gender"];
NSInteger age = [resultSet intForColumn:@"age"];
[dic setValue:name forKey:@"name"];
[dic setValue:gender forKey:@"gender"];
[dic setValue:@(age) forKey:@"age"];
[array addObject:dic];
}
//釋放resultSet
[resultSet close];
//關(guān)閉數(shù)據(jù)庫
[db close];
return array;
}