iOS FMDB有返回結果集和無返回結果集

joker_king發表於2018-12-19

#準備工作 在當前類的延展中宣告一個資料庫的物件

@interface RootViewController ()
@property (strong, nonatomic)FMDatabase *db;
@end
複製程式碼

建立一個資料庫的路徑

- (NSString *)dbPath{
    NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
NSUserDomainMask, YES)firstObject] stringByAppendingPathComponent:@"FMDB.sqlite"];
    return dbPath;
}
複製程式碼

開啟或者建立一個資料庫

- (FMDatabase *)openOrCreate{
    //建立資料庫物件
    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之無返回結果集 一切不是SELECT命令的命令都視為更新。這包括 CREATE, UPDATE, INSERT,ALTER,COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE (等)。簡單來說,只要不是以SELECT開頭的命令都是UPDATE命令,也就是無返回結果集。 示例程式碼

- (BOOL)opertationNoResultWithSql:(NSString *)sql operationTag:(NSString *)tag{
//開啟資料庫
    FMDatabase *db = [self openOrCreate];
//執行非查詢操作
    BOOL isSuccess = [db executeUpdate:sql];
//當操作完成後,關閉資料路
    [self.db close];
    if (isSuccess) {
        NSLog(@"%@操作成功",tag);
        return YES;
    }else{
        NSLog(@"%@操作失敗",tag);
        return NO;
    }
}
複製程式碼

##FMDB之有返回結果集

  • SELECT命令就是查詢,執行查詢的方法是以 -excuteQuery開頭的。
  • 執行查詢時,如果成功返回FMResultSet物件, 錯誤返回nil. 與執行更新相當,支援使用 NSError**引數。同時,你也可以使用 -lastErrorCode和-lastErrorMessage獲知錯誤資訊。
  • 為了遍歷查詢結果,你可以使用while迴圈。你還需要知道怎麼跳到下一個記錄。使用FMDB,很簡單實現。

示例程式碼

- (NSArray *)queryWithSql:(NSString *)sql{
//開啟資料庫
    FMDatabase *db = [self openOrCreate];
//執行sql語句,將返回結果先暫存到resultSet中
    FMResultSet *resultSet = [db executeQuery:sql];
//從resultSet中取出每一條記錄
    NSMutableArray *array = [NSMutableArray array];
    while ([resultSet next]) {//next:判斷sqlite3_step(stament) == row
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
/*每次執行while迴圈的時候,都是一個新的記錄被取出,所以我們需要一個新的字典來盛放新的記錄,
所以每次進while迴圈的時候都需要構建一個新的字典物件。*/
        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];
//關閉資料庫
    [db close];
    return array;
}
複製程式碼

相關文章