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

标签 swift sqlite fmdb

我需要使用编译时长度未知的参数数组运行 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/

相关文章:

ios - 多对一

javascript - 噢,使用executeSql 将值插入Web sql 时chrome 中出现错误

iphone - 我们如何打开一个已经存在的数据库 fmdb 以及在哪里包含它?

ios - 难以处理 SQLite 中的编码

ruby-on-rails - 启动rails5服务器时sqlite3加载错误

ios - 转义 FMDB iOS 查询中的特殊字符

objective-c - 如何使用 FMDB 将图像(字节)保存和检索到 SQLite(blob)?

swift - tableView 中的节名称和日期

ios - 将自定义坐标设置为函数,Waze Integration

使用嵌套框架的 iOS 问题