无法更新数据库

时间:2013-04-12 04:12:34

标签: iphone ios sqlite

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

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 个答案:

答案 0 :(得分:1)

有几点意见:

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

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

    您不需要stringWithFormat调用,因为您绑定了变量。您也不需要围绕双倍值的引号。

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

  3. 同样在您的绑定语句中,如果它们不是SQLITE_OK,则表示您未登录sqlite3_errmsg

  4. 您的sqlite3_step根本没有检查其返回代码,更不用说sqlite3_errmsg如果它不是SQLITE_DONE的话。

  5. 最重要的是,您必须与?占位符绑定,并且由于您未在失败时记录sqlite3_errmsg而导致您失明。