我一直在阅读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似乎是对的,我没有收到任何错误! 我不知道发生了什么事...... 请帮忙! 谢谢!!
答案 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);
使用上述代码后,您将能够运行更新查询。希望它能帮助别人。