为什么对SQLite3的数据库查询失败?

时间:2019-05-06 13:31:57

标签: swift xcode sqlite

我正在练习使用SQLite练习与数据库的连接,但有一个问题,我的数据库已创建,并且该表具有不同的字段,我的表的ID是主键,一个字段用于名称和一个姓氏字段,问题在于信息存储在数据库中,但是在查询信息时,姓氏与名称存储在同一字段中,因为在查询时,它返回两倍的姓氏keep < / p>

我试图查阅信息,并在插入信息时发现问题,但我不知道是什么原因

这是我用来创建数据库的代码:

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let fileUrl = try!

            FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("MGrex.sqlite")

        if sqlite3_open(fileUrl.path, &db) != SQLITE_OK{
            print("Error al abrir la base de datos")
        }

        let createTableQuery = "CREATE TABLE IF NOT EXISTS Gear (id INTEGER PRIMARY KEY AUTOINCREMENT, nombre TEXT, apellido TEXT)"

        if sqlite3_exec(db, createTableQuery, nil, nil, nil) != SQLITE_OK
        {
            print("Error al crear la tabla")
        }

        print("Everything is fine")


    }

这是我的IBAction,在其中我从TextField检索名称和姓氏,验证它们是否为空,然后执行查询:

@IBAction func agregar(_ sender: Any) {
        let nombre = nombreTextFiel.text?.trimmingCharacters(in: .whitespacesAndNewlines)
        let apellido = apellidoTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines)

        if(nombre?.isEmpty)!{
            print("El nombre esta vacio")
            return;
        }
        if(apellido?.isEmpty)!{
            print("El apellido esta vacio")
            return;
        }

        var stmt: OpaquePointer?

        let insertQuery = "INSERT INTO Gear (nombre, apellido) VALUES (?,?)"

        if(sqlite3_prepare(db, insertQuery, -1, &stmt, nil)) != SQLITE_OK{
            print("Error al iniciar la consulta")
        }

        if sqlite3_bind_text(stmt, 1, nombre, -1, nil) != SQLITE_OK{
            print("Error al guardar el nombre")
        }

        if sqlite3_bind_text(stmt, 2, apellido, -1, nil) != SQLITE_OK{
            print("Error al guardar el apellido")
        }

        //Para registrar un int es el siguiente metodo

        //if(sqlite3_bind_int(stmt, 2, (apellido! as NSString.intValue))) != SQLITE_OK{
          //  print("Error al guardar un numero int")
        //}

        if (sqlite3_step(stmt) == SQLITE_DONE){
            print("Datos agregados")
        }
    }

这是我用来查询记录的代码:

override func viewDidLoad() {
        super.viewDidLoad()

        //Primero abrimos una conexion a la base de datos

        let fileUrl = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("MGRex.sqlite")

        if sqlite3_open(fileUrl.path, &db) != SQLITE_OK{
            print("Error al abrir la base de datos")
        }

    }

这是我执行查询的IBAction:

@IBAction func consultarUsuario(_ sender: Any) {
        //Aqui va todo el codigo para consultar los registros de la base de datos
        let nombreKey: String = (nombreConsultado.text?.trimmingCharacters(in: .whitespacesAndNewlines))!

        if(nombreKey.isEmpty){
            print("El nombre para consultar esta vacio")
            return;
        }

        print(nombreKey)

        var stmt: OpaquePointer?

        //Codigo experimental para consultar informacion en mi base de datos
        if sqlite3_prepare(db, "SELECT id, nombre, apellido FROM Gear", -1, &stmt, nil) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db))
            print("Error preparando el SELECT: \(errmsg)")
        }
        //Recorremos los registros para encontrar el que buscamos
        while sqlite3_step(stmt) == SQLITE_ROW{

            let id = sqlite3_column_int64(stmt, 0)
            print("id = \(id);", terminator: "")

            if let nombre = sqlite3_column_text(stmt, 1){
                let nombreString = String(cString: nombre)
                print("Nombre = \(nombreString)")
            }else{
                print("Nombre no encontrado")
            }

            if let apellido = sqlite3_column_text(stmt, 2){
                let apellidoString = String(cString: apellido)
                print("Apellido = \(apellidoString)")
            }else{
                print("Apellido no encontrado")
            }

        }

        if sqlite3_finalize(stmt) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db))
            print("Error al finalizar el stmt preparado: \(errmsg)")
        }

        stmt = nil

        if sqlite3_close(db) != SQLITE_OK{
            print("Error closing database")
        }

        db = nil

    }

0 个答案:

没有答案