2012-06-15 2 views
0

테이블에 열이 12 개 있습니다. 마지막 두 개의 열이 새로 추가됩니다. 나는 sqlite3 데이터베이스를 사용한다. 마지막으로 생성 된 두 개의 새 열 이외의 다른 열에 where 절을 사용하면 데이터베이스가 만들어지고 쿼리가 올바르게 실행됩니다. 마지막 두 열 때문에 캐치되지 않는 예외 'NSInvalidArgumentException', 이유에 종료 응용 프로그램을 던지는 응용 프로그램 충돌하게 NULL 문자열을 반환 : ' * + [있는 NSString stringWithUTF8String을 :] : NULL CString을'* *Sqlite 준비 문

때 SQL Manager에서 쿼리가 실행됩니다. 마지막 두 열을 검색 할 수있었습니다. 나는 준비 문에서 어떤 것이 잘못되었다고 생각한다.

NSString *query = @"select * from tableName where lastColumn = 'Value'"; 
    const char *sqlStatement = [query UTF8String]; 
sqlite3_stmt *compiledStatement; 
    NSLog(@"could not prepare statement: %s\n", sqlite3_errmsg(database)); 

if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 
// Loop through the results and add them to the feeds array 
while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
    } 

도와주세요. 나는 마지막으로 두 개의 열이 사라진 곳을 전혀 모른다. :)

답변

0

stringWithUTF8String : 메서드에 NULL을 전달 중입니다. 허용되지 않습니다. NSString 객체를 인스턴스화하기 전에 sqlite에서 얻은 값을 확인해야합니다.

const char *ctext = sqlite3_column_text(compiledStatement, 2); 
if (ctext) { 
    text = [NSString stringWithUTF8String:ctext]; 
} 

새 열을 추가하면이 열의 모든 기존 행의 값이 NULL로 설정됩니다.

+0

그러나 문자열이 NULL인지 아닌지 확인하기 위해 statement 루프를 준비하지 않습니다. 진술서를 작성하기 전에 내가 이것을 실행하기를 원합니까? 준비문에서 데이터베이스를 반복하지 않으면 어떻게 처리합니까? –

+0

당신이 얻는 오류는 준비 문과 전혀 관련이 없습니다. 귀하의 오류에 대한 NSString, 그리고 sqlite 그냥 평범한 C API입니다, 그것은 NSStrings를 할당하지 않습니다 –

+0

만약 내가 WHERE 절에 대한 내 값으로 마지막 두 열 중 하나를 사용하여, 그것은 심지어 문 루프를 준비하지 않습니다. 마지막 두 열 이외의 다른 열 값을 WHERE 절 값으로 사용하면 준비 문 루프가 실행되고 마지막 두 열 값을 검색하려고하면 NSInvalidArgementException이 throw되어 응용 프로그램이 중단됩니다. 이것은 내 문제입니다. 전에 당신에게 명확한 생각을주지 못해서 미안해 .. –