gpt4 book ai didi

iphone - 无法更新数据库

转载 作者:行者123 更新时间:2023-11-29 13:15:22 25 4
gpt4 key购买 nike

我无法更新一个字段。请建议我的代码中有什么错误。

Code:

- (int) updateTaskDoneDate:(double)donedate ontaskid:(int)taskId
{
sqlite3 *database;
@try {
if (sqlite3_open([self.databasePath UTF8String], &database) == SQLITE_OK)
{
NSString *sql_str = [NSString stringWithFormat:@"update task set donedate='%f' where taskid=%d ", donedate ,taskId];
NSLog(@"sql str: %@",sql_str);
const char *sql = [sql_str UTF8String];

sqlite3_stmt *statement;
statement = [self PrepareStatement:sql];

NSDate *myDate;
myDate=[NSDate date];

int a1 = sqlite3_bind_double(statement, 1, [myDate timeIntervalSince1970]);
int a2 = sqlite3_bind_int(statement, 2, taskId);
NSLog(@"a1a2 %d, %d", a1, a2);
if (statement)
{
if (a1 != SQLITE_OK || a2 != SQLITE_OK)
{
sqlite3_finalize(statement);
return 0;
}
sqlite3_step(statement);
}
sqlite3_finalize(statement);
}
}
@catch (NSException *exception){
[self showException:exception];
}
@finally {
sqlite3_close(database);
return 1;
}
}

最佳答案

一些观察:

  1. 您正在使用 sqlite3_bind_xxx(这很好,比使用 stringWithFormat 构建 SQL 好得多),但是您没有任何 ? SQL 中的占位符。您的 SQL 应该是:

    NSString *sql_str = @"update task set donedate=? where taskid=?";

    您不需要 stringWithFormat 调用,因为您正在绑定(bind)变量。您也不需要在 double 值周围加上引号。

  2. 您没有显示 prepare 语句,但如果失败,您是否记录 sqlite3_errmsg

  3. 同样在您的绑定(bind)语句中,如果它们不是SQLITE_OK,您就不会记录sqlite3_errmsg

  4. 你的 sqlite3_step 根本不检查它的返回码,更不用说记录 sqlite3_errmsg 如果它不是 SQLITE_DONE

最重要的是,您必须使用 ? 占位符进行绑定(bind),并且您正在盲目飞行,因为您没有在失败时记录 sqlite3_errmsg

关于iphone - 无法更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15962920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com