2011-11-29 94 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,但也许你不在乎。