ios 에서 FMDB 를 사용 하 는 몇 가지 작은 문제

2228 단어 iosexc_bad_accessFMDB
오늘 버그 를 디 버 깅 한 결과 몇 가지 문제 가 모두 FMDB 오용 으로 인 한 것 을 발 견 했 습 니 다.해결 한 후에 기록 하 세 요.
값 이 null 인 열 처리
먼저 resultDictionary 방법 을 통 해 ResultSet 을 NSDictionary 로 변환 합 니 다.
FMResultSet *rs = [db executeQuery:sql];
while ([rs next]) {
    [result addObject:[rs resultDictionary]];
}

그리고 object ForKey 로 열 값 을 추출 합 니 다.이 열 이 비어 있 으 면 NSNull 로 되 돌아 갑 니 다.그러나 비어 있 지 않 은 것 으로 판단 할 때 오류 가 발생 했 습 니 다.
NSString* originFilePath = [row objectForKey:columnName];//       
if (originFilePath){
    //                 
}

위의 코드 가 틀 렸 습 니 다.이 열 이 비어 있어 도 비어 있 지 않 은 분기 로 들 어 갑 니 다.다음 코드 로:
NSString* originFilePath = [row objectForKey:columnName];//       
if ((NSNull *)originFilePath != [NSNull null]){
    //                 
}

SQL 을 연결 할 때 표 이름 은 변수 일 수 없습니다.
간단 한 전체 표 조 회 를 하고 결 과 를 0 row 로 되 돌려 주 었 습 니 다.마지막 으로 표 이름 이 변수 가 될 수 없 음 을 발 견 했 습 니 다.다음 두 가지 쓰기 가 모두 틀 렸 습 니 다.
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]];

좋은 웹페이지 즐겨찾기