如何在 FMDB 查询 iOS Swift 4 中使用 Like with Text?

Posted

技术标签:

【中文标题】如何在 FMDB 查询 iOS Swift 4 中使用 Like with Text?【英文标题】:How to using Like with Text in FMDB query iOS Swift 4? 【发布时间】:2017-10-14 07:09:22 【问题描述】:

我想用 like 进行查询并尝试这样:

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)

但它不起作用。

【问题讨论】:

【参考方案1】:

试试这个:

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)

【讨论】:

即使它有效,您也应该始终尝试像在代码中那样使用参数。这使您的代码不易受到潜在脚本注入的影响,并让您有机会创建在数据库中运行得更快的准备好的查询语句。【参考方案2】:

它对我有用(swift 4,Xcode 9):

let texto_like : String = "%\(texto)%"

let sql = "select * from TABLE where MY_COLUMN like ? COLLATE NOCASE"

【讨论】:

【参考方案3】:

只需在 SQL 语句中使用 ? 传递参数,并使用 SQL 通配符将传递的值包装起来,如下所示:

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

原因是在 SQLite 中,并且可能在每个其他 SQL 引擎中,参数是由其值和类型信息组成的完整实体。因此,在 '%?%' 这样的引号 (') 中包含参数从来都不是必需的,实际上是错误的做法。

另外,like 运算符只需要一个字符串表达式作为它的操作数,如果需要,它可能包含 SQL 通配符。因此,您只需创建一个嵌入通配符(%、_ 等)的字符串表达式,并在需要时将其传递给您的语句。

【讨论】:

它真的对你有用吗?我之前也遇到过同样的问题 我知道它不起作用,但如果这个解决方案可能会解决我的问题。我也试过像 /%pp/% 但没有得到想要的输出。如果您找到任何答案或解决方案,请在此处为像我这样的人发布。 @reza_khalafi @JitendraModi & @raza_khalafi 坦率地说,我从未在 Swift 中尝试过。在 Objective-C 中,我必须声明像 NSString *name = @"%%pp%%" 这样的变量,它可以优雅地工作,没有任何故障。我必须在 Objective-C 中使用 %%,因为 % 单独是该语言的格式说明符,应该用另一个百分号 (%%) 转义。我不知道这是否也适用于 Swift。不过你可以试一试。 是的,我们一定会试一试,但感谢您的回复。谢谢你

以上是关于如何在 FMDB 查询 iOS Swift 4 中使用 Like with Text?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift FMDB 中使用 executeQuery() 执行基于条件的查询

如何在 swift 3 中使用现有的 SQLite? (FMDB)

初学者 FMDB iOS 数据库、表创建

FMDB/sqlite 查询函数问题

如何在通用 iOS 设备而不是模拟器上使用 FMDB?

如何在 Swift 中使用“FMDB/SQLCipher”进行加密和解密?