FMDB 更新语句不使用我的值

Posted

技术标签:

【中文标题】FMDB 更新语句不使用我的值【英文标题】:FMDB update statement doesnt use my values 【发布时间】:2018-02-08 20:34:45 【问题描述】:

您好,我正在尝试对数据库中的现有行执行更新。我一直在我的 sql 语句中使用问号 ? 并给 FMDB 一个值数组来替换 ? 的值。这是一个使用此逻辑的示例INSERT 语句:

let sqlStatement = "INSERT INTO Cards (Column1, Column2, Column3) VALUES (?, ?, ?)"

try! db.executeUpdate(sqlStatement, values: Data)

现在我想为更新语句执行此操作,我已经让该语句在 SQLPro 中工作,但我似乎无法让它在 1 行上工作。这是我在 swift / fmdb 之外使用的 SQL 查询:

UPDATE MyTable 
SET ColumnId='5', Column2='Helloworld', Column3='data' 
WHERE ColumnId='5'

现在这是我在 swift 中的声明:

let sqlStatement = "UPDATE Cards SET ColumnId='?', Column2='?', Column3='?'"

try! db.executeUpdate(sqlStatement, values: Data)

当我运行此语句时,更新通过,但数据库中的所有数据都设置为?。我不想将我的数据直接放入 sql 语句字符串中(因为文档告诉你不要这样做,避免 sql injection 之类的)。

如何修复此语句,以便更新我的应用程序上的 sql 数据库?

【问题讨论】:

【参考方案1】:

更新声明会是这样的:

-(void)updateValue:(Model *)data
    
        [instance.database open];
        BOOL isUpdated=[instance.database executeUpdate:@"UPDATE Cards SET ColumnId =? , Column2 =? , Column3 =? WHERE ColumnId =?",data.ColumnId,data.Column2,data.Column3,data.ColumnId];
        [instance.database close];
    

斯威夫特版本:

func updateValue(_ data: Model) 
    instance.database.open()
    let isUpdated: Bool = instance.database.executeUpdate("UPDATE Cards SET ColumnId =? , Column2 =? , Column3 =? WHERE ColumnId =?", data.columnId, data.column2, data.column3, data.columnId)
    instance.database.close()

【讨论】:

我同意这一点,我之前在目标 c 中使用过这个确切的更新声明。我怎样才能用swift写同样的东西?如果我没有深入到应用程序中,我实际上会在 objc 中重写我的数据库类。 查看编辑后的答案@Bodungus

以上是关于FMDB 更新语句不使用我的值的主要内容,如果未能解决你的问题,请参考以下文章

FMDB处理动态插入语句

使用FMDB进行插入语句出现 obj = va_arg(args, id)

FMDB 和索引 0 超出空数组的范围

FMDB:错误 14,无法打开数据库文件

FMDB 使用方法

如何使用 like 语句运行 SQL 更新查询