подготовка к сбою: неверный параметр или другое неправильное использование API в sqlite swift при вставке данных - PullRequest
0 голосов
/ 15 января 2019
let db = Database.openDatabase()

let insertStatementString = "INSERT INTO SignupDetails VALUES (\((self.txtUsername.text!.trimmingCharacters(in: .whitespaces))), \((self.txtPassword.text!.trimmingCharacters(in: .whitespaces))))"

Database.insertIntoSignupDetails(db: db, insertStatementString: insertStatementString)

sqlite3_close(db)

Приведенный выше код содержит мой запрос на вставку данных в базу данных с использованием sqlite.

Я создал таблицу, как показано ниже: -

let db = Database.openDatabase()
let createTableString =
    """
        CREATE TABLE IF NOT EXISTS SignupDetails(
        username CHAR(255),
        password CHAR(255));
        """

Database.createTable(db: (db != nil) ? db : OpaquePointer(UserDefaults.standard.object(forKey: Constant.db) as! String), createTableString: createTableString)

sqlite3_close(db)

и я также успешно выполнил следующий код для создания таблицы: -

static func createTable(db: OpaquePointer?, createTableString: String) {    
    var createTableStatement: OpaquePointer? = nil

    if sqlite3_prepare_v2(db, createTableString, -1, &createTableStatement, nil) == SQLITE_OK {
        if sqlite3_step(createTableStatement) == SQLITE_DONE {
            print("table created.")
        } else {
            print("table could not be created.")
        }
    } else {
        print("CREATE TABLE statement could not be prepared.")
    }

    sqlite3_finalize(createTableStatement)
}

Но моя проблема в том, что я пытаюсь вставить данные в эту существующую таблицу
полученная ошибка показана ниже: -

Код: -

    var insertStatement: OpaquePointer?


    guard sqlite3_prepare_v2(db, insertStatementString, -1, &insertStatement, nil) == SQLITE_OK else {
        let errmsg = String(cString: sqlite3_errmsg(db))
        print("failure preparing: \(errmsg)")
        return
    }

    if sqlite3_step(insertStatement) == SQLITE_OK {
        print("Successfully inserted row.")
    } else {
        print("Could not insert row.")
    }

    sqlite3_finalize(insertStatement)

Ошибка: -

подготовка к сбоям: неверный параметр или другое неправильное использование API

1 Ответ

0 голосов
/ 15 января 2019

Вам не хватает одинарных кавычек вокруг строковых переменных, строка должна выглядеть примерно так:

INSERT INTO RegistrationDetails VALUES ('gopabandhu@bt.com', '123')

let insertStatementString = "INSERT INTO SignupDetails VALUES ('\((self.txtUsername.text!.trimmingCharacters(in: .whitespaces)))', '\((self.txtPassword.text!.trimmingCharacters(in: .whitespaces)))')"

Альтернативой является использование заполнителей в вашем утверждении

let statement = "INSERT INTO SignupDetails(username, password) VALUES (?, ?)"

if sqlite3_prepare_v2(db, insertStatementString, -1, &insertStatement, nil) == SQLITE_OK {
    sqlite3_bind_text(insertStatement, 1, username.utf8String, -1, nil)
    sqlite3_bind_text(insertStatement, 2, password.utf8String, -1, nil)

    if sqlite3_step(insertStatement) == SQLITE_OK {
        //...
    }
}

, где username и password - параметры, отправленные на insertIntoSignupDetails

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