如何将空值存储到数据库表

时间:2014-03-04 08:49:32

标签: ios sql database insert conditional-operator

我正在向数据库表插入值。我有声明获取数据和插入。如果我没有任何值,我需要插入空白而不是NULL

[parentDict setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 5)== NULL?"":(char *)sqlite3_column_text(compiledStatement, 5)] forKey:@"AM_Answer"];

2 个答案:

答案 0 :(得分:0)

你只是感觉parentDict。将所有值放入其中后,请检查您不想要NULL值的键。

if([parentDict objectForKey:@"AM_Answer"] == NULL)
     [parentDict setObject:@"" forKey:@"AM_Answer"];

答案 1 :(得分:0)

通常,您在字典中插入[NSNull null]以表示空值:

const char *column5 = sqlite3_column_text(compiledStatement, 5);

if (column5 == NULL)
    [parentDict setObject:[NSNull null] forKey:@"AM_Answer"];
else
    [parentDict setObject:[NSString stringWithUTF8String:(char *) column5] forKey:@"AM_Answer"];

您也可以使用零长度字符串(例如@""),但通常最好区分空值和零长度字符串。


就将空值插入数据库而言,您可以使用SQL NULL值:

int rc;

if ((rc = sqlite3_exec(db, "insert into test (column_a, column_b) values ('valueA', null)", NULL, NULL, NULL)) != SQLITE_OK)
    NSLog(@"insert failed %d: %s", rc, sqlite3_errmsg(db));

或者,如果您正在对值进行动态绑定,则可以使用sqlite3_bind_null()函数:

sqlite3_stmt *statement;

if ((rc = sqlite3_prepare_v2(db, "insert into test (column_a, column_b) values (?, ?)", -1, &statement, NULL)) != SQLITE_OK)
    NSLog(@"prepare failed %d: %s", rc, sqlite3_errmsg(db));

NSString *valueA = @"valueA";
if ((rc = sqlite3_bind_text(statement, 1, [valueA UTF8String], -1, SQLITE_TRANSIENT)) != SQLITE_OK)
    NSLog(@"bind a failed %d: %s", rc, sqlite3_errmsg(db));

if ((rc = sqlite3_bind_null(statement, 2)) != SQLITE_OK)
    NSLog(@"bind b failed %d: %s", rc, sqlite3_errmsg(db));

if ((rc = sqlite3_step(statement)) != SQLITE_DONE)
    NSLog(@"step failed %d: %s", rc, sqlite3_errmsg(db));

sqlite3_finalize(statement);

如果您使用FMDB

,后一个示例会大大简化
BOOL success = [db executeUpdate:@"insert into test (column_a, column_b) values (?, ?)", @"valueA", [NSNull null]];
if (!success)
    NSLog(@"Insert failed: %@", [db lastErrorMessage]);