如何在Swift中使用变量编写SQL Select查询?

时间:2019-06-01 00:54:39

标签: swift sqlite

编辑:现在,我知道我的查询语句没有结果了……

如何在Swift中使用局部变量编写Select语句。

我有50多个列,如何将数组中的所有列名连接起来?

let queryStatementStringSearch = "SELECT * FROM TABLE where Col1 = (?);"

var queryStatement: OpaquePointer? = nil
// 1
if sqlite3_prepare_v2(db, queryStatementStringSearch=, -1, &queryStatement, nil) == SQLITE_OK {
    sqlite3_bind_text(queryStatement, 1, userInput, -1, nil)
    // 2
    if sqlite3_step(queryStatement) == SQLITE_ROW {
        // 3
        let id = sqlite3_column_int(queryStatement, 0)

        // 4
        let queryResultCol1 = sqlite3_column_text(queryStatement, 1)
        let name = String(cString: queryResultCol1!)

        // 5
        print("Query Result:")
        print("\(id) | \(name)")

    } else {
        print("Query returned no results")
    }
} else {
    print("SELECT statement could not be prepared")
}

1 个答案:

答案 0 :(得分:1)

您的“ SELECT”语句应为:

SELECT * FROM TABLE where Col1 = ?

sqlite3_bind_xxx的调用期望从1开始的列号。您正在传递索引2,但它必须为1

sqlite3_bind_text(queryStatement, 1, userInput, -1, nil)

确保您在准备好的语句上调用sqlite3_finalize

使用SELECT *也是一个坏主意。明确列出列名。这样可以确保在调用sqlite3_column_xxx时,传递的索引(从0开始,而不是从1开始)索引到固定位置的已知列。