Как написать SQL Select Query с переменной в Swift? - PullRequest
0 голосов
/ 01 июня 2019

РЕДАКТИРОВАТЬ: теперь я получаю, что моя инструкция запроса не имеет результатов, когда я знаю, что это делает ...

Как написать оператор Select в Swift, использующий локальную переменную.

У меня более 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 Ответ

1 голос
/ 01 июня 2019

Ваше утверждение "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) относится к известному столбцу в фиксированной позиции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...