2012-06-15 91 views
0

我在我的表中有12列。最近添加了兩列。我使用sqlite3數據庫。如果我對最後創建的兩個新列以外的任何其他列使用where子句,則會創建數據庫並正確執行查詢。最後兩列返回NULL字符串這使得應用程序崩潰扔終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',理由是: ' * + [NSString的stringWithUTF8String:]:NULL CSTRING' * *Sqlite準備聲明

當該查詢在SQL管理器中執行,我可以檢索最後兩列。我想在我的準備聲明中有些地方出了問題。

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

你傳遞NULL給stringWithUTF8String:方法,這是不允許的。在實例化NSString對象之前,您應該檢查從sqlite獲得的值。

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

當您添加新列時,所有現有行中此列的值都設置爲NULL。

+0

但是,它不會進入準備語句循環來檢查字符串是否爲NULL。您希望我在準備聲明前執行此操作?如果我在準備聲明中沒有這樣做,如何循環訪問數據庫? –

+0

您收到的錯誤與準備聲明完全無關。你的錯誤是關於NSString,而sqlite只是簡單的C api,它不分配NSStrings –

+0

如果我使用最後兩列中的任何一個作爲WHERE子句的值,它甚至不會進入準備語句循環。如果我使用除最後兩列以外的任何其他列值作爲我的WHERE子句值,那麼當我嘗試檢索最後兩列值時,它將進入prepare語句循環內,並且應用程序崩潰引發NSInvalidArguementException。這是我的問題。對不起,以前沒有給你清晰的想法.. –