2017-10-14 75 views
0

我想和得到查询像,并尝试这样的:如何在FMDB查询中使用Like与文本iOS Swift 4?

let name = "pp" //apple 

let db = openDB() 
    do { 
     var queryString = "select * from products where name like '%?%' and deleted = 0 order by id desc" 
     let rs = try db.executeQuery(queryString, values:[name]) 
     var arr:Array<Product> = [] 
     while rs.next() { 
     arr.append(parseProductDB(rs)) 
     } 
     closeDB(db) 
} catch { 
     print("failed: \(error.localizedDescription)") 
     closeDB(db) 
} 

,但它不工作。

回答

0

只需在你的sql语句中传递参数?与SQL通配符换你传递的值,就像这样:

let name = "%pp%" 
... 
var queryString = "select * from products where name like ? and deleted = 0 order by id desc" 

的原因是在SQLite和可能在所有其他SQL引擎的参数是由它的价值和类型信息的一个完整的实体。因此,将参数封装在引号(')(如'%?%')中是不需要的,实际上是一种错误的做法。 另外like运算符只需要一个字符串表达式作为操作数,如果需要可能包含SQL通配符。所以你只需要创建一个带有嵌入通配符(%,_等)的字符串表达式,并在需要时将它传递给你的语句。

希望它有帮助。

+0

没有真的为你工作?我也遇到过相同的问题 –

+0

@JitendraModi不适合我。 –

+0

我知道这是行不通的,但如果这个解决方案可能会解决我的问题。我也试过/%pp /%,但没有得到想要的结果。如果您找到任何答案或解决方案,请将其发布给像我这样的人。 @reza_khalafi –

0

就试试这个:

let db = openDB() 
do { 
    var queryString = 
    queryString = String(format:"select * from products where name like '%%%@%%' and deleted = 0 order by id desc",name) 
    let rs = try db.executeQuery(queryString, values:nil) 
    var arr:Array<Product> = [] 
    while rs.next() { 
    arr.append(parseProductDB(rs)) 
    } 
    closeDB(db) 

} catch { 
      print("failed: \(error.localizedDescription)") 
      closeDB(db) 
} 
+0

@JitendraModi试试这个。其作品。 –

+0

即使它工作,你应该总是尝试使用像你在代码中使用的参数。这使得您的代码不易受潜在脚本注入的影响,并让您有机会创建在数据库中运行更快的准备好的查询语句。 –