我需要在编译时使用长度未知的参数数组运行SQLite查询(如果需要,我可以使用FMDB,但可以使用本地SQLite)。到目前为止,我已经根据数组长度手动将正确数量的绑定插入到字符串中:将任意长度的数组绑定到SQLite查询
func getBindString (_ arrayCount: Int) -> String {
return [String](repeating: "?", count: arrayCount).joined(separator: ",")
}
let someArray = ["foo","bar"]
let sqlString = "delete from someTable where someColumn in (\(getBindString(someArray.count)))"
db.executeUpdate(sqlString, withArgumentsIn: someArray)
/* delete from someTable where someColumn in ('foo','bar') */
这只是感觉真的很不雅观。有没有处理这个问题的“适当”方法?我在网上找到的所有东西都过时了几年,所有推荐的内容直接插值,这更糟糕。
@matt - 插值的自己,而不是'?'占位符,更糟糕,恕我直言,因为你然后手动插入引号到SQL中,可以有问题的价值观,他们本身有任何引号或任何受SQL字符串转义的东西。通过使用适当数量的'?'占位符构建SQL,可以避免一系列可能的问题。 – Rob
@Rob不错的一点,谢谢。 – matt