14

FMDBを介してSELECT…WHERE…INステートメントに配列を渡すことは可能ですか?私はこのように配列を内破しようとしました:

NSArray *mergeIds; // An array with NSNumber Objects
NSString *mergeIdString = [mergeIds componentsJoinedByString:@","];

NSString *query = @"SELECT * FROM items WHERE last_merge_id IN (?)";
FMResultSet *result = [database executeQuery:query, mergeIdString];

これは、配列にオブジェクトが1つしかない場合にのみ機能します。これにより、FMDBは、挿入された文字列全体を引用符で囲んでいると思います。

そこで、配列をそのままFMDBのメソッドに渡してみました。

NSArray *mergeIds; // An array with NSNumber Objects
NSString *query = @"SELECT * FROM items WHERE last_merge_id IN (?)";
FMResultSet *result = [database executeQuery:query, mergeIds];

これはまったく機能しません。

READMEやFMDBのgithubページのサンプルには何も見つかりませんでした。

ありがとう、ステファン

4

6 に答える 6

13

私は同じ問題を抱えていましたが、少なくとも自分のアプリではそれを理解しました. まず、クエリを次のように構成し、疑問符の数を配列内のデータ量と一致させます。

NSString *getDataSql = @"SELECT * FROM data WHERE dataID IN (?, ?, ?)";

次に、次のexecuteQuery:withArgumentsInArray呼び出しを使用します。

FMResultSet *results = [database executeQuery:getDataSql withArgumentsInArray:dataIDs];

私の場合、NSArray 内に dataIDs という名前の NSString オブジェクトの配列がありました。このSQLクエリを機能させるためにあらゆる種類のことを試しましたが、最終的にこのSQL /関数呼び出しの組み合わせで、適切な結果を得ることができました.

于 2012-07-18T07:41:39.107 に答える
10

使用する必要があると思いますexecuteQueryWithFormat(FMDB のドキュメントによると、これは推奨される方法ではありません)。とにかく、ここに私の解決策があります:

NSArray *mergeIds; // An array of NSNumber Objects
NSString *mergeIdString = [mergeIds componentsJoinedByString:@","];

NSString *query = @"SELECT * FROM items WHERE last_merge_id IN (?)";
FMResultSet *res = [self.database executeQueryWithFormat:query, mergeIdString];
于 2011-12-12T18:46:40.627 に答える
7

Wayne Liu に加えて、文字列に一重引用符または二重引用符が含まれていないことがわかっている場合は、次のように簡単に実行できます。

NSString * delimitedString = [strArray componentsJoinedByString:@"','"];
NSString * sql = [NSString stringWithFormat:@"SELECT * FROM tableName WHERE fieldName IN ('%@')", delimitedString];
于 2014-02-22T18:51:21.407 に答える
5

キーが文字列の場合、次のコードを使用してSQLコマンドを生成します。

(strArrayはNSString要素を含むNSArrayであると想定します)

NSString * strComma = [strArray componentsJoinedByString:@"\", \""];
NSString * sql = [NSString stringWithFormat:@"SELECT * FROM tableName WHERE fieldName IN (\"%@\")", strComma];

注意:strArrayの要素に「二重引用符」記号が含まれている可能性がある場合は、代わりに2つの二重引用符を記述して、それらをエスケープするための追加のコード(これらの2行の前)を記述する必要があります。

于 2012-02-15T07:49:30.770 に答える
0

これは、配列クエリ パラメータを複数の名前付きパラメータに分割する FMDatabase の Swift 拡張です。

extension FMDatabase {

    func executeQuery(query: String, params:[String: AnyObject]) -> FMResultSet? {

        var q = query
        var d = [String: AnyObject]()
        for (key, val) in params {
            if let arr = val as? [AnyObject] {
                var r = [String]()
                for var i = 0; i < arr.count; i++ {
                    let keyWithIndex = "\(key)_\(i)"
                    r.append(":\(keyWithIndex)")
                    d[keyWithIndex] = arr[i]
                }
                let replacement = ",".join(r)
                q = q.stringByReplacingOccurrencesOfString(":\(key)", withString: "(\(replacement))", options: NSStringCompareOptions.LiteralSearch, range: nil)
            }
            else {
                d[key] = val
            }
        }

        return executeQuery(q, withParameterDictionary: d)
    }

}

例:

let sql = "SELECT * FROM things WHERE id IN :thing_ids"
let rs = db.executQuery(sql, params: ["thing_ids": [1, 2, 3]])
于 2015-06-09T16:50:46.837 に答える