我无法更新一个字段。请建议我代码中有什么错误。
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;
}
}
最佳答案
一些观察:
sqlite3_bind_xxx
(这很好,比使用stringWithFormat
构建SQL更好),但是您的SQL中没有任何?
占位符。您的SQL应该是:NSString *sql_str = @"update task set donedate=? where taskid=?";
您不需要
stringWithFormat
调用,因为您要绑定变量。您也不需要双精度值附近的引号。 sqlite3_errmsg
? SQLITE_OK
,那么您也不会登录sqlite3_errmsg
。 sqlite3_step
根本不检查其返回码,如果不是sqlite3_errmsg
,则更不用说记录SQLITE_DONE
了。 最重要的是,您必须绑定
?
占位符,并且由于没有在失败时记录sqlite3_errmsg
而处于盲目状态。