1

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

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;
    }
}
4

1 回答 1

1

几点观察:

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

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

    您不需要stringWithFormat调用,因为您正在绑定变量。您也不需要双精度值的引号。

  2. 你没有显示准​​备语句,但如果它失败了,你在记录sqlite3_errmsg吗?

  3. 同样在您的绑定语句中,如果它们不是SQLITE_OK,则您没有记录sqlite3_errmsg

  4. 你根本没有检查它的返回码,如果不是sqlite3_step,更不用说记录了。sqlite3_errmsgSQLITE_DONE

最重要的是,您必须与占位符绑定,?并且因为您没有登录sqlite3_errmsg失败而盲目飞行。

于 2013-04-12T04:21:46.090 回答