2016-10-12 1 views
0

In Swift, wenn Sie eine Abfrage von einer lokalen Variablen machen möchten, wird es von 'selectedButton' getan. Wie ist es in SQLite möglich?Wie kann eine Select-Abfrage mithilfe einer lokalen Variablen in SQLite auf Swift erstellt werden?

{ 
    var selectedButton = 1; 
    let dbPath = NSBundle.mainBundle().pathForResource("practise2015", ofType:"sqlite3") 
    let db = FMDatabase(path: dbPath) 
    if db.open(){ 
     let categoryLevelID = try! db.executeQuery("SELECT * FROM `LEVEL` WHERE CATEGORY_ID = " + selectedButton, values: nil) 
    } 
} 
+2

Welche Art von Variable ist 'db'? Dies könnte für die SQL-Injektion anfällig sein - am besten verwenden Sie Platzhalter wie '?' Und Bindings. – sbooth

Antwort

0

Können Sie nicht einfach so etwas tun?

let categoryLevelID = try! db.executeQuery("SELECT * FROM LEVEL WHERE CATEGORY_ID = \(selectedButton.tag)", values: nil) 

actuall Sie können nicht nur eine UIButton als Argument übergeben, müssen Sie einige String, Int oder Double-Wert. Category_id klingt wie ein Int für mich, also ich denke, Sie haben die richtige category_id in Ihrem UIButton, da es Tag ist

Aber Sie sollten Abfragen mit Datenbindung trotzdem tun. Werfen Sie einen Blick auf dieses Tutorial von Ray Wenderlich: https://www.raywenderlich.com/123579/sqlite-tutorial-swift

Oder diese: http://www.techotopia.com/index.php/An_Example_SQLite_based_iOS_8_Application_using_Swift_and_FMDB

+0

Dies ist eine schreckliche Praxis. Erstellen Sie auf diese Weise keine Abfragezeichenfolgen. Binden Sie die Werte ordnungsgemäß in die Abfrage ein. – rmaddy

+0

@rmaddy guten Rat, aber das ist tatsächlich, was ich gesagt habe. Meine Lösung bietet eine schnelle und schmutzige Möglichkeit zu sehen, ob es funktioniert + 2 Links, um zu zeigen, wie es gemacht werden sollte. – gasparuff

-1
let queryStatementString = String(format: "%@%d", "SELECT * FROM 'LEVEL' WHERE CATEGORY_ID = %d ", selectedButton) 
let categoryLevelID = try! db.executeQuery(queryStatementString, values: nil) 

By the way, executeQuery in Swift kehrt nicht Daten, die die Art und Weise FMDB kehrt zurück. Wenn Sie es mit SQLite tun möchten, hier ist Code:

if sqlite3_open(part1DbPath, &db) == SQLITE_OK { 
    if sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement, >nil) == SQLITE_OK { 
     if sqlite3_step(queryStatement) == SQLITE_ROW { 
      let id = sqlite3_column_int(queryStatement, 0) 
      let queryResultCol1 = sqlite3_column_text(queryStatement, 1) 
      print("Query Result:") 
     } else { 
      print("Query returned no results") 
     } 
    } else { 
     print("SELECT statement could not be prepared") 
    } 
} 
+0

Das ist eine schreckliche Praxis. Erstellen Sie auf diese Weise keine Abfragezeichenfolgen. Binden Sie die Werte ordnungsgemäß ein. – rmaddy

+0

Dieser Code kann nicht ordnungsgemäß bereinigt werden. Sie müssen die vorbereitete Anweisung abschließen. Sie müssen die Datenbank schließen. Sie sollten die Protokollierung hinzufügen, wenn Fehler auftreten. – rmaddy

Verwandte Themen