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

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调用,因为您要绑定变量。您也不需要双精度值附近的引号。
  • 您没有显示prepare语句,但是如果失败,是否要记录sqlite3_errmsg
  • 同样,在您的bind语句上,如果它们不是SQLITE_OK,那么您也不会登录sqlite3_errmsg
  • 您的sqlite3_step根本不检查其返回码,如果不是sqlite3_errmsg,则更不用说记录SQLITE_DONE了。

  • 最重要的是,您必须绑定?占位符,并且由于没有在失败时记录sqlite3_errmsg而处于盲目状态。

    10-06 06:35