Ios 如何在sql中编写更新数据的查询?

Ios 如何在sql中编写更新数据的查询?,ios,sql,objective-c,Ios,Sql,Objective C,目前,我在iOS中编写更新数据的查询 NSString *query = [NSString stringWithFormat: @"update *from ericsson_review_form_field_table set value = %@ where fieldId = %@ and form_index = %d",strFValue,strFieldId,formIndex]; 但它不起作用。 请告诉我更新值的sql查询。先用谷歌搜索,然后再询问..请参见下面的更新示例 U

目前,我在iOS中编写更新数据的查询

NSString *query = [NSString stringWithFormat: @"update *from ericsson_review_form_field_table set value = %@ where fieldId = %@ and form_index = %d",strFValue,strFieldId,formIndex];
但它不起作用。
请告诉我更新值的sql查询。

先用谷歌搜索,然后再询问..请参见下面的更新示例

UPDATE table_name
SET column1 = value1
WHERE [condition];

UPDATE CUSTOMERS
SET ADDRESS = 'Pune', SALARY = 1000.00;

NSString *updateSQL = [NSString stringWithFormat:@"update table_name SET name='%@'  where regno='1000'"];

希望它能帮助您……

您在编写查询以更新任何记录时犯了一个错误,请尝试一下

NSString *updateSQL = [NSString stringWithFormat:@"UPDATE EMPLOYEES set name = '%@', department = '%@', age = '%@' WHERE id = ?",
                                employee.name,
                                employee.department,
                                [NSString stringWithFormat:@"%d", employee.age]];

更新表中记录的简单方法如下

UPDATE table2 
SET table2.col1 = table1.col1, 
table2.col2 = table1.col2,
...
FROM table1, table2 
WHERE table1.memberid = table2.memberid
目前我的代码是

 - (BOOL)updateReviewFields:(NSString *)strFieldId andFormIndex:(int)formIndex withFValue:(NSString *)strFValue{
sqlite3_stmt *statement = nil;
NSString *query;
if(sqlite3_open([[appDelegate databasePath] UTF8String],&database) == SQLITE_OK){
   query = [NSString stringWithFormat: @"update ericsson_review_form_field_table set value = %@ where fieldId = %@ and form_index = %d",strFValue,strFieldId,formIndex];
    if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL)
       == SQLITE_OK){
        sqlite3_bind_text(statement, 1, [strFieldId UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(statement, 13, [strFValue UTF8String], -1, SQLITE_TRANSIENT);
       if(sqlite3_step(statement))
            return YES;
        else
            return NO;
    }
    sqlite3_finalize(statement);
}
sqlite3_close(database);
return NO;
}


现在它工作正常。

您发布了一个代码示例:

- (BOOL)updateReviewFields:(NSString *)strFieldId andFormIndex:(int)formIndex withFValue:(NSString *)strFValue{
    sqlite3_stmt *statement = nil;
    NSString *query;
    if(sqlite3_open([[appDelegate databasePath] UTF8String],&database) == SQLITE_OK){
       query = [NSString stringWithFormat: @"update ericsson_review_form_field_table set value = %@ where fieldId = %@ and form_index = %d",strFValue,strFieldId,formIndex];
        if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL)
           == SQLITE_OK){
            sqlite3_bind_text(statement, 1, [strFieldId UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_text(statement, 13, [strFValue UTF8String], -1, SQLITE_TRANSIENT);
           if(sqlite3_step(statement))
                return YES;
            else
                return NO;
        }
        sqlite3_finalize(statement);
    }
    sqlite3_close(database);
    return NO;
}
我看不出上面这些怎么可能起作用

您使用的是sqlite3\u bind\u文本,但没有?SQL中要绑定到的占位符。您应该检查sqlite3_bind_文本调用的返回代码,如果他们返回SQLITE_OK,我会感到震惊

您正在绑定第一项和第十三项。后一个绑定调用,到第十三个?,当然不会工作,除非你至少有十三个?占位符

在调用sqlite3\u步骤后,您会立即返回,而不会执行sqlite3\u finalize语句,这样无疑会导致内存泄漏。如果在sqlite3_步骤之后得到这些返回语句,您也永远不会关闭数据库

您正在测试sqlite3\u步骤是否。。。。这是没有意义的,因为sqlite3_步骤总是返回一个非零值,成功时返回SQLITE_,错误时返回一些非零错误代码

如果任何SQLite调用失败,我建议记录sqlite3\u errmsg

我可能建议将方法的返回值更改为更新的行数。这样,您可以区分成功的更新;b没有行更新,但没有错误;c是个失败。我可能会在错误时返回负值,如果没有与WHERE条件匹配的行,则返回零,如果成功更新了n行,则返回正值n。我使用sqlite3_更改来确定更新了多少行

最后,我郑重地建议不要使用stringWithFormat来构建SQL,至少在字符串值包含任何用户提供的输入时是这样,因为您将面临引用和/或SQL注入问题

因此,我建议:

/** Update fields
 *
 * @param strFieldId The fieldId column string value
 * @param formIndex The form_index integer value
 * @param strFValue The string to which the `value` column should be updated.
 *
 * @return Returns the number of rows updated. Return negative value on failure. Return zero if no rows matched the WHERE criteria.
 */
- (int)updateReviewFields:(NSString *)strFieldId andFormIndex:(int)formIndex withFValue:(NSString *)strFValue {
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    sqlite3 *database;
    NSString *databasePath = [appDelegate databasePath];

    sqlite3_stmt *statement = nil;
    int rowCount = -1;
    int rc;

    if ((rc = sqlite3_open([databasePath UTF8String], &database)) != SQLITE_OK) {
        NSLog(@"Unable to open database: %@ (%ld)", databasePath, (long)rc);
        return rowCount;
    }

    const char *query = "update ericsson_review_form_field_table set value = ? where fieldId = ? and form_index = ?";

    if ((rc = sqlite3_prepare(database, query, -1, &statement, NULL)) != SQLITE_OK) {
        NSLog(@"sqlite3_prepare fail: %s (%ld)", sqlite3_errmsg(database), (long)rc);
        sqlite3_close(database);
        return rowCount;
    }

    if ((rc = sqlite3_bind_text(statement, 1, [strFValue UTF8String], -1, NULL)) != SQLITE_OK) {
        NSLog(@"sqlite3_bind_text 1 fail: %s (%ld)", sqlite3_errmsg(database), (long)rc);
    } else if ((rc = sqlite3_bind_text(statement, 2, [strFieldId UTF8String], -1, NULL)) != SQLITE_OK) {
        NSLog(@"sqlite3_bind_text 2 fail: %s (%ld)", sqlite3_errmsg(database), (long)rc);
    } else if ((rc = sqlite3_bind_int(statement, 3, formIndex)) != SQLITE_OK) {
        NSLog(@"sqlite3_bind_int 3 fail: %s (%ld)", sqlite3_errmsg(database), (long)rc);
    } else if ((rc = sqlite3_step(statement)) != SQLITE_DONE) {
        NSLog(@"sqlite3_step fail: %s (%ld)", sqlite3_errmsg(database), (long)rc);
    } else {
        rowCount = sqlite3_changes(database);
    }

    sqlite3_finalize(statement);

    sqlite3_close(database);

    return rowCount;
}

不工作?为什么不呢?会发生什么?会发生什么?它应该更新什么?你能给出定义吗?有错误代码吗?如果是,是什么?如果没有,你怎么知道它不起作用?您能展示示例数据和预期结果吗?缺少太多信息,无法知道正确答案是什么。我的查询是错误的,因此我在更新数据时遇到了问题。现在我的问题由我回答如下。用户2338816这是可以理解的。但是我们需要知道您希望查询做什么。我们知道您希望它更新某些内容,但我们不知道应该更新哪些内容。如果我们不知道表和列的定义,我们就不知道正确的语法。坦白说,我不建议每次调用都打开和关闭数据库。但我把它留在了我的代码示例中,因为这是您最初的代码片段所做的,但我通常建议打开一次,并且只在应用程序终止时关闭。