gpt4 book ai didi

swift - 将任意长度的数组绑定(bind)到 SQLite 查询

转载 作者:行者123 更新时间:2023-11-28 15:40:19 27 4
gpt4 key购买 nike

我需要使用编译时长度未知的参数数组运行 SQLite 查询(我使用的是 FMDB,但如有必要,可以使用 native SQLite)。到目前为止,我一直在根据数组长度手动将正确数量的绑定(bind)插入到字符串中:

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') */

这感觉真的很不优雅。有什么“正确”的方法来处理这个问题吗?我在网上能找到的所有东西都已经过时好几年了,而且都建议直接对值进行插值,这更糟糕。

最佳答案

我看不出这有什么“不雅”。您正在使用基于字符串的语言 (SQL),并且非常巧妙地实时构建字符串。

您的代码与我个人编写的代码不同;我不喜欢在不需要的地方进行字符串插值,这里也不需要,所以我会提出更像这样的东西(我也认为使用 map 而不是 数组(重复:):

let someArray = ["foo","bar"]
let bindString = someArray.map{_ in "?"}.joined(separator: ",")
let sqlString = "delete from someTable where someColumn in (" + bindString + ")"

如果你必须多次形成一个像bindString这样的字符串,那么一定要把它变成一个实用函数。但是我会把它写成 Array 的扩展:

extension Array {
var bindString : String {
return "(" + self.map{_ in "?"}.joined(separator: ",") + ")"
}
}

这样,您的字符串构造将如下所示:

let someArray = ["foo","bar"]
let sqlString = "delete from someTable where someColumn in " + someArray.bindString

但所有这些纯粹是风格上的调整;你所做的没有错误。

关于swift - 将任意长度的数组绑定(bind)到 SQLite 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43771447/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com