iOS上的Sqlite数据库查询仅更新一个字段

时间:2014-02-06 12:41:00

标签: ios sqlite

我一直在阅读sqlite更新查询的所有答案,但我的工作没有。

它只更新“categoria”列,但不更新“用户评论”

“categoria”是我的Sqlite数据库的最后一列,但我有更多的列,我没有更新,这是否会影响我的查询?我应该更新每一列,虽然我没有更新它们吗?

这是我的代码:

NSString *query =  [NSString stringWithFormat:@"UPDATE apps set userComment='%@', categoria='%@'   WHERE id='%d'",app.userComment, app.categoria, [[app appID] intValue]];

     sqlite3_stmt *statement;

    if (sqlite3_prepare_v2(_dataBase, [query UTF8String], -1, &statement, nil)
        == SQLITE_OK)
    {

         NSLog(@"error: %s", sqlite3_errmsg(_dataBase));

        if (sqlite3_step(statement) != SQLITE_DONE)
        {
            NSLog(@"error: %s", sqlite3_errmsg(_dataBase));
        }
        else
        {
            NSLog(@"updateContact SUCCESS - executed command %@",query);
        }
        sqlite3_reset(statement);
        sqlite3_step(statement);
        sqlite3_finalize(statement);

           // sqlite3_finalize(statement);
    }
    else
        NSLog(@"error: %s", sqlite3_errmsg(_dataBase));

我的查询的NSLog似乎是对的,我没有收到任何错误! 我不知道发生了什么事...... 请帮忙! 谢谢!!

3 个答案:

答案 0 :(得分:2)

尝试param。

- (void) update
{
    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
    {
        if(updateStatement == nil)
        {
            const char *sql = "UPDATE apps set userComment = ?, categoria = ? WHERE id = ?";
            if(sqlite3_prepare_v2(database, sql, -1, & updateStatement, NULL) != SQLITE_OK)
                NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database));
        }

        sqlite3_bind_text(updateStatement, 1, [comment UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(updateStatement, 2, [categoria UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_int(updateStatement, 3, id);


        if(SQLITE_DONE != sqlite3_step(updateStatement))
            NSAssert1(0, @"Error while updating data. '%s'", sqlite3_errmsg(database));
        else
            //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
            //noteID = sqlite3_last_insert_rowid(database);

            //Reset the update statement.
            sqlite3_reset(updateStatement);
        sqlite3_close(database);
        deleteStatement = nil;
    }
    else
        sqlite3_close(database);
}

答案 1 :(得分:0)

你在一个int值附近加上引号:

WHERE id='%d' ... [[app appID] intValue]

使用params(?)并绑定int / int64以避免:

sqlite3_bind_int(statement, 3, [[app appID] intValue]);

在sqlite3_step调用中,请务必检查是否已完成检查。

if (sqlite3_step(statement) != SQLITE_DONE)
{
    NSLog(@"error: %@", sqlite3_errmsg(_dataBase));
}

NS注销您的更新声明。确保它实际上具有您认为应该的userComment值。

使用params?对于值并使用bind并使用UTF8String:

sqlite3_bind_text(statement, 1, [[app userComment] UTF8String], -1, SQLITE_STATIC);

由于sqlite3是一个C API,你应该在你的prepare语句中使用NULL而不是nil。

在OK准备调用之后打印我们的sqlite3_errmsg不需要。重置后,检查更有趣,步骤。

作为参考,请参阅本答案中的代码:

how to save the data in sqlite3 in iphone

该帖子包含我知道有用的更新代码。

答案 2 :(得分:0)

我有使用Update查询的简单解决方案。现在您不需要使用sqlite3_bind_text或sqlite3_bind_int。

使用更新查询作为普通查询并在查询中传递参数,因为我们使用'%@'

传递字符串

以下是示例查询

queryString = [NSString stringWithFormat:@"UPDATE <Table-name> SET <column-name> = '%@', <column-name2> = '%@';", value1, value2];

if (sqlite3_prepare(contactDB, query, -1, &statement, NULL) == SQLITE_OK)
{

}

if (sqlite3_step(statement) == SQLITE_DONE)
{
     //NSLog(@"ok");
}
sqlite3_finalize(statement);

使用上述代码后,您将能够运行更新查询。希望它能帮助别人。