2011-11-29 95 views
2
sqlite3_bind_int(statement, 1, nil); 

如何在我的上述語句中添加null,因爲我正在使此字段自動增量。SQLITE3插入空值

這裏是我的代碼:

if (sqlite3_open([[self dataFilePath] UTF8String], &database)!= SQLITE_OK) 
{ 
sqlite3_close(database); 
NSAssert(0, @"Failed to open database"); 
} 
NSLog(@"json count ========== %i",[jsonArray count]); 
    for (int i =0 ; i < [jsonArray count]; i++) 
    // while (i < [jsonArray count]) 
{ 
dictionary = [jsonArray objectAtIndex:i]; 
char *errorMsg; 

sqlite3_stmt *statement; 
if(sqlite3_prepare_v2(database, [insertQuery UTF8String], -1, &statement, nil) == SQLITE_OK) 
{ 
// NSLog(@"%@",[dictionary valueForKey:@"text"]); 
sqlite3_bind_null(statement, 1); 
sqlite3_bind_text(statement, 2, [[dictionary valueForKey:@"date"] UTF8String], -1, NULL); 
    // NSLog(@"date %@",[dictionary valueForKey:@"date"]); 

sqlite3_bind_text(statement, 3, [[dictionary valueForKey:@"text"] UTF8String], -1, NULL); 
    // NSLog(@"text %@",[dictionary valueForKey:@"text"]); 

} 
if (sqlite3_step(statement) != SQLITE_DONE) 
    { 
     NSAssert1(0, @"Error updating table: %s", errorMsg); 
     sqlite3_finalize(statement); 
    } 
sqlite3_close(database); 
} 

選擇:

sqlite3 *database; 
if (sqlite3_open([[self dataFilePath] UTF8String], &database) 
    != SQLITE_OK) { sqlite3_close(database); 
    NSAssert(0, @"Failed to open database"); 
} 
NSString *query = [self selectQueryInDB]; 
sqlite3_stmt *statement; 
if (sqlite3_prepare_v2(database, [query UTF8String], 
         -1, &statement, nil) == SQLITE_OK) { 
    while (sqlite3_step(statement) == SQLITE_ROW) 
    { 
     int row = sqlite3_column_int(statement, 0); 

     if (row == indexPathRow+1) 
     { 
      char *field1 = (char *)sqlite3_column_text(statement, 1); 
      char *field2 = (char *)sqlite3_column_text(statement, 2); 
      NSString *f1 = [[NSString alloc] initWithUTF8String:field1]; 

      NSString *f2 = [[NSString alloc] initWithUTF8String:field2]; 

      NSString *fullData = [NSString stringWithFormat:@"%@ %@",f1,f2]; 
      NSLog(@"%@",fullData); 
     } 

    } 
    sqlite3_finalize(statement); 
} 
sqlite3_close(database); 

我在的NSString越來越SIGABRT * F1作爲*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSPlaceholderString initWithUTF8String:]: NULL cString' 請告訴我,我做錯了。

回答

6

sqlite3_bind_int(statement, 1, nil)將結合0到所述第一綁定點,而不是NULL。 0和NULL在SQL中不是一回事。

我認爲你正在尋找sqlite3_bind_null。它將NULL綁定到綁定點,如下所示:

sqlite3_bind_null(statement, 1); 

這裏沒有任何參數用於NULL;它是以函數的名義。

另外,未綁定的參數默認爲NULL。所以除非你使用sqlite3_reset,否則你根本不需要使用它。

(因爲我們是在綁定和復位的話題,我應該提到sqlite3_clear_bindings,結合所有參數設置爲NULL。)

問題2

你更新了這個提SIGABRT在NSString * f1行中。

有兩個問題你的代碼,我看到:

  1. sqlite3_column_text爲0爲主;第一列是0,而不是1

    char *field1 = (char *)sqlite3_column_text(statement, 1); 
    

    應該是(是的,列基於即使綁定是基於1 0。。):NULL如果NULL

    char *field1 = (char *)sqlite3_column_text(statement, 0); 
    
  2. sqlite3_column_text可以返回在數據中,但initWithUTF8String:不接受NULL作爲值。

我建議這樣做:

NSString *f1 = field1 ? [[NSString alloc] initWithUTF8String:field1] : nil; 

利用這一點,你就結束了一個無NSString如果你有在數據NULL列。你可以對此做出決定,當你確實需要一個字符串時,很容易做到f1 ?: @""

另一種方法是更改​​查詢:

SELECT Field FROM Table; 

要:

SELECT COALESCE(Field,'') FROM Table; 

您將不再能夠告訴我們,如果現場原是NULL,但也許你不在乎。