我无法更新一个字段。请告诉我我的代码中有什么问题。
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;
}
}
答案 0 :(得分:1)
有几点意见:
您正在使用sqlite3_bind_xxx
(这比使用stringWithFormat
构建SQL更好,但是您的SQL中没有任何?
个占位符。你的SQL应该是:
NSString *sql_str = @"update task set donedate=? where taskid=?";
您不需要stringWithFormat
调用,因为您绑定了变量。您也不需要围绕双倍值的引号。
您没有显示prepare语句,但如果失败,您是否正在记录sqlite3_errmsg
?
同样在您的绑定语句中,如果它们不是SQLITE_OK
,则表示您未登录sqlite3_errmsg
。
您的sqlite3_step
根本没有检查其返回代码,更不用说sqlite3_errmsg
如果它不是SQLITE_DONE
的话。
最重要的是,您必须与?
占位符绑定,并且由于您未在失败时记录sqlite3_errmsg
而导致您失明。