你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> ios中使用FMDB的幾個小問題

ios中使用FMDB的幾個小問題

編輯:IOS開發綜合

今天調試BUG,發現幾個問題都是對FMDB誤用引起的,解決後記錄一下:

值為null的列處理

先是通過resultDictionary方法,將ResultSet轉換成NSDictionary

FMResultSet *rs = [db executeQuery:sql];
while ([rs next]) {
    [result addObject:[rs resultDictionary]];
}

然後用objectForKey取出某一列的值,如果該列為空,則返回NSNull,但是判斷非空時發生錯誤:

NSString* originFilePath = [row objectForKey:columnName];// 原始文件路徑
if (originFilePath){
    // 非空處理            
}

上面的代碼是錯的,即使此列為空,也會走進非空的分支。要用下面的代碼:

NSString* originFilePath = [row objectForKey:columnName];// 原始文件路徑
if ((NSNull *)originFilePath != [NSNull null]){
    // 非空處理            
}

拼接SQL時,表名不能是變量

做一個簡單的全表查詢,返回結果居然是0 row,最後發現表名不能是變量,以下2種寫法都是錯的

FMResultSet *rs = [db executeQuery:@"select * from %@", tableName];

FMResultSet *rs = [db executeQuery:@"select * from ?", tableName];

查詢參數可以是變量,然後綁定參數,但是表名必須是常量,所以要這麼寫:

NSString *sql = [NSString stringWithFormat:@"select * from %@", tableName];
FMResultSet *rs = [db executeQuery:sql];

先提前把sql拼好,傳給executeQuery方法的是一個常量

傳給executeQuery或者executeUpdate的參數,必須是NSObject

執行一句SQL時,FMDB報EXC_BAD_ACCESS,應用崩潰。在stackoverflow上查到,傳給execute方法的參數,必須是NSObject。如果本來是原始數據類型如int,long等,要先用Wrapper類包裝一下。以下的代碼是錯的:

FMResultSet *rs = [db executeQuery:sql, latestBackupTime, now];// latestBackupTime和now是long類型,造成EXC_BAD_ACCESS

應該寫成:

long now = [[NSDate date] timeIntervalSince1970];
// 傳給executeQuery()的參數必須是NSObject,不能是原始數據類型,否則報EXC_BAD_ACCESS
FMResultSet *rs = [db executeQuery:sql, [NSNumber numberWithLong:latestBackupTime], [NSNumber numberWithLong:now]];

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved