コンパイル時に未知の長さのパラメータ配列を使用して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 - '? 'プレースホルダではなく、値自体を補間するのは悪いですが、IMHOは手動で引用符をSQLに挿入しているので問題ありません。 SQL文字列エスケープの対象。適切な数の '? 'プレースホルダを使用してSQLを構築することで、一連の問題を回避できます。 – Rob
@Robいい点、ありがとう。 – matt