2017-10-14 7 views
0

Ich will Abfrage erhalten mit wie und versuchen wie folgt aus:Wie Verwenden von Like mit Text in FMDB Abfrage 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) 
} 

, aber es funktioniert nicht.

Antwort

0

Übergeben Sie einfach den Parameter in Ihrer SQL-Anweisung mit? und wickeln Sie Ihre übergebenen Wert mit SQL Wildcard-Zeichen, wie folgt aus:

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

Der Grund in SQLite ist und möglicherweise in jedem anderen SQL-Engine ein Parameter ist ein komplettes Unternehmen seinen Wert aus und geben Informationen. Ein Wrapping-Parameter in Anführungszeichen (') wie '%?%' wird nie benötigt und ist eigentlich eine falsche Vorgehensweise. Der Operator like erwartet lediglich einen String-Ausdruck als Operanden, der bei Bedarf SQL-Platzhalterzeichen enthalten kann. Sie müssen also nur einen Zeichenfolgenausdruck mit eingebetteten Platzhalterzeichen (%, _, usw.) erstellen und bei Bedarf an Ihre Anweisung übergeben.

Ich hoffe, es hilft.

+0

hat es wirklich für Sie gearbeitet? Ich sah auch das gleiche Problem vor –

+0

@JitendraModi Nicht für mich gearbeitet. –

+0

Ich weiß, dass es nicht funktioniert, aber wenn diese Lösung funktioniert, wird das meine Probleme lösen. Ich habe auch versucht, /% pp /%, aber nicht gewünschte Leistung zu bekommen. Wenn Sie irgendeine Antwort oder Lösung finden, posten Sie es hier für jemanden wie mich. @reza_khalafi –

0

Genau dies versuchen:

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 versuchen Sie dies. es funktioniert. –

+0

Auch wenn es funktioniert, sollten Sie immer versuchen, Parameter wie in Ihrem Code zu verwenden. Dies macht Ihren Code weniger anfällig für potenzielle Skriptinjektionen und ermöglicht es Ihnen, vorbereitete Abfrageanweisungen zu erstellen, die in der Datenbank schneller ausgeführt werden. –