2011-12-05 49 views
12

是否可以通過FMDB將數組傳遞給SELECT ... WHERE ... IN語句? 我試圖破滅數組是這樣的:通過FMDB將數組傳遞給sqlite 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]; 

這隻能如果有數組,這使我相信,FMDB加引號圍繞整個崩盤串正好1對象。

所以,我想傳遞的是FMDB的方法數組:

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

這並不在所有的工作。

我在自述文件或FMDB的github頁面上的示例中沒有找到任何有關它的信息。

感謝,斯特凡

回答

9

嗯,我想我必須使用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]; 
+2

但不知何故,這還是當對象是NSString的,而不是不工作NSNumbers。:-( – Stefan

+4

這不起作用SQL清理會看到這個單個變量。 –

5

如果密鑰字符串,我用下面的代碼來生成SQL命令:

(假設strArray是一個包含的NSString元素一個NSArray)

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

請注意:如果strArray中的任何元素可能包含「雙引號」符號,則需要編寫額外的代碼(在這兩行之前),以便通過編寫2個雙引號來轉義它們。

11

我遇到了同樣的問題,我弄明白了,至少對於我自己的應用程序。首先,結構查詢,像這樣,問號的數量匹配數據的陣列中的量:

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

然後使用executeQuery:withArgumentsInArray電話:

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

對我來說,我有一個NSArray中名爲dataIDs的NSString對象數組。我嘗試了各種各樣的東西來獲得這個SQL查詢的工作,並最終與這個組合的SQL /函數調用,我能夠得到正確的結果。

4

添加到韋恩·劉,如果你知道這些字符串不包含單或雙引號,你可以簡單地做:

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

下面是FMDatabase迅捷的擴展,打破陣列查詢參數到一個名爲多參數。

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]]) 
相關問題