分离SQLite数据库

时间:2019-03-26 09:26:32

标签: ios swift iphone swift3

我在一个在Swift 4,Swift 5中使用SQLite数据库的项目上工作,当它位于您要从中访问数据库的“ viewController”中时,但是当我将其集成到其中时,我有一个可以工作的代码一个避免冗余代码的类个体会给我消息“ SQL逻辑错误”,我理解消息的含义,并且产生此问题的原因是代码经过测试且句子正确,只是无法将其分离并调用来自“ viewController”中的另一个类 为利益相关者附上了完整项目的链接:https://github.com/dqueralto/TFG

我尝试了“ DispatchQueue ...后台”和不同类型的功能(私有,公共,内部),我想不出其他任何东西,因为我是Swift的新手

import UIKit
import SQLite3

class ViewController: UIViewController{
private var db: OpaquePointer?
private var dbName: String = "Datos.sqlite"
private var usuarios = [Usuario]()
private var conexion = ConexionDB()


@IBOutlet weak var usuario: UITextField!
@IBOutlet weak var contrasenia: UITextField!


@IBOutlet weak var alerta: UILabel!
@IBOutlet weak var alerta2: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()


    DispatchQueue.global(qos: .background).async {//hilo de fonde
        print("Esto se ejecuta en la cola de fondo")
        self.conexion.conectarDB()

        DispatchQueue.main.async {//hilo principal
            print("Esto se ejecuta en la cola principal, después del código anterior en el bloque externo")

            //Creación de ADMIN en caso de no existir al menos un usuario----------------------------------------------
            if self.usuarios.count == 0
            {
                self.conexion.insertarUsuario(usu: "admin", pass: "admin", tipo: "A",nom: "Administrador",apell: "Administrador",fec_nac: "16/10/1996",email: "admin@admin.admin",sexo: "poco")
                self.conexion.insertarUsuario(usu: "vu", pass: "vu", tipo: "U",nom: "Vista Usario",apell: "Vista Usario",fec_nac: "16/10/1996",email: "vu@vu.vu",sexo: "poco")
                if self.usuarios.count == 2
                {
                    print("ADMIN insertado al loguear")
                }else if self.usuarios.count == 0
                {
                    print("ADMIN no se ha podido insertar al loguearse")
                }
            }

            for usu in self.usuarios
            {
                print("usu: "+usu.usuario)
                print("pass: "+usu.contrasenia)
                print("tipo: "+usu.tipo)
            }
            print("fin :"+String(self.usuarios.count))

        }//fin hilo de principal
    }//fin del hilo de fondo

}

import Foundation
import SQLite3

internal class ConexionDB {

var db: OpaquePointer?
var usuarios = [Usuario]()
private var dbName: String = "Datos.sqlite"


internal func conectarDB()
{
    //INDICAMOS DONDE SE GUARDARA LA BASE DE DATOS Y EL NOMBRE DE ESTAS
    let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        .appendingPathComponent("Datos.sqlite")
    //INDICAMOS SI DIERA ALGUN FALLO AL CONECTARSE
    if sqlite3_open(fileURL.path, &db) != SQLITE_OK {
        print("error al abrir la base de datos")
    }
    else {//SI PODEMOS CONECTARNOS A LA BASE DE DATOS CREAREMOS LA ESTRUCTURA DE ESTA, SI NO EXISTIERA NO SE HARIA NADA
        print("base abierta")
        //if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Usuarios (usuario TEXT PRIMARY KEY, contrasenia TEXT, tipo TEXT, nombre TEXT)", nil, nil, nil) != SQLITE_OK {
        if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Usuarios (usuario TEXT PRIMARY KEY, contrasenia TEXT, tipo TEXT, nombre TEXT, apellidos TEXT, fec_nac TEXT, email TEXT,sexo TEXT);COMMIT;", nil, nil, nil) != SQLITE_OK {
            //if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Usuarios (usuario TEXT PRIMARY KEY, contrasenia TEXT, tipo TEXT, nombre TEXT, apellidos TEXT, fec_nac TEXT, email TEXT,sexo TEXT); CREATE TABLE IF NOT EXISTS Movimientos (num_reg TEXT PRIMARY KEY, FOREIGN KEY(usuario) REFERENCES Usuarios(usuario), fecha TEXT, importe REAL, tipo BOOLEAN);", nil, nil, nil) != SQLITE_OK {
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error creating table: \(errmsg)")
        }
    }
    print("BD creada")
    self.crearObjUsuario()
    print("Usuarios creados")
    if usuarios.count == 0
    {
        self.insertarUsuario(usu: "admin", pass: "admin", tipo: "A",nom: "Administrador",apell: "Administrador",fec_nac: "16/10/1996",email: "admin@admin.admin",sexo: "poco")
        print("ADMIN insertado.")
    }

}

internal func conectarDB(nombreDB: String)
{
    //INDICAMOS DONDE SE GUARDARA LA BASE DE DATOS Y EL NOMBRE DE ESTAS
    let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        .appendingPathComponent(nombreDB)
    //INDICAMOS SI DIERA ALGUN FALLO AL CONECTARSE
    if sqlite3_open(fileURL.path, &db) != SQLITE_OK {
        print("error al abrir la base de datos")
    }
    else {//SI PODEMOS CONECTARNOS A LA BASE DE DATOS CREAREMOS LA ESTRUCTURA DE ESTA, SI NO EXISTIERA NO SE HARIA NADA
        print("base abierta")
        //if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Usuarios (usuario TEXT PRIMARY KEY, contrasenia TEXT, tipo TEXT, nombre TEXT)", nil, nil, nil) != SQLITE_OK {
        if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Usuarios (usuario TEXT PRIMARY KEY, contrasenia TEXT, tipo TEXT, nombre TEXT, apellidos TEXT, fec_nac TEXT, email TEXT,sexo TEXT);COMMIT;", nil, nil, nil) != SQLITE_OK {
            //if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Usuarios (usuario TEXT PRIMARY KEY, contrasenia TEXT, tipo TEXT, nombre TEXT, apellidos TEXT, fec_nac TEXT, email TEXT,sexo TEXT); CREATE TABLE IF NOT EXISTS Movimientos (num_reg TEXT PRIMARY KEY, FOREIGN KEY(usuario) REFERENCES Usuarios(usuario), fecha TEXT, importe REAL, tipo BOOLEAN);", nil, nil, nil) != SQLITE_OK {
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error creating table: \(errmsg)")
        }
    }
    print("BD creada")
    self.crearObjUsuario()
    print("Usuarios creados")
    if usuarios.count == 0
    {
        self.insertarUsuario(usu: "admin", pass: "admin", tipo: "A",nom: "Administrador",apell: "Administrador",fec_nac: "16/10/1996",email: "admin@admin.admin",sexo: "poco")
        print("ADMIN insertado.")
    }

}



internal func crearObjUsuario(){


    //GUARDAMOS NUESTRA CONSULTA
    let queryString = "SELECT * FROM Usuarios;"

    //PUNTERO DE INSTRUCCIÓN
    var stmt:OpaquePointer?

    //PREPARACIÓN DE LA CONSULTA
    if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error preparing insert: \(errmsg)")
        return
    }

    //RECORREMOS LOS REGISTROS
    while(sqlite3_step(stmt) == SQLITE_ROW){
        print("illo")
        let usuario = String(cString: sqlite3_column_text(stmt, 0))
        let contrasenia = String(cString: sqlite3_column_text(stmt, 1))
        let tipo = String(cString: sqlite3_column_text(stmt, 2))
        let nombre = String(cString: sqlite3_column_text(stmt, 3))
        let apellidos = String(cString: sqlite3_column_text(stmt, 4))
        let fec_nac = String(cString: sqlite3_column_text(stmt, 5))
        let email = String(cString: sqlite3_column_text(stmt, 6))
        let sexo = String(cString: sqlite3_column_text(stmt, 7))
        print("illo2")
        //AÑADIMOS LOS VALORES A LA LISTA
        self.usuarios.append(Usuario(
            usuario: String(describing: usuario),
            contrasenia: String(describing: contrasenia),
            tipo:String(describing: tipo)
            ,nombre:String(describing: nombre)
            ,apellidos:String(describing: apellidos)
            ,fec_nac:String(describing: fec_nac)
            ,email:String(describing: email)
            ,sexo:String(describing: sexo)

        ))
    }
    print("siiiiiiiiii")
}

internal func insertarUsuario(usu:String,pass:String, tipo: String, nom: String,apell: String, fec_nac: String,email: String, sexo: String)  {
    //CREAMOS EL PUNTERO DE INSTRUCCIÓN
    var stmt: OpaquePointer?

    //CREAMOS NUESTRA SENTENCIA
    let queryString = "INSERT INTO Usuarios(usuario, contrasenia, tipo, nombre, apellidos, fec_nac, email, sexo) VALUES ('"+usu+"','"+pass+"','"+tipo+"','"+nom+"','"+apell+"','"+fec_nac+"','"+email+"','"+sexo+"');commit;"
    //PREPARAMOS LA SENTENCIA
    if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print(queryString)
        print("error preparing insert: \(errmsg)")
        return
    }


    //EJECUTAMOS LA SENTENCIA PARA INSERTAR LOS VALORES
    if sqlite3_step(stmt) != SQLITE_DONE {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("fallo al insertar en usuarios: \(errmsg)")
        //nurvc.alerta2.isHidden = true
        //nurvc.alerta3.isHidden = true
        //nurvc.alerta.isHidden = false
        return
    }

    //FINALIZAMOS LA SENTENCIA
    sqlite3_finalize(stmt)
    print("Insertado")
    //displaying a success message
    print("Usuario saved successfully")

}

internal func eliminarUsuarios()
{
    //GUARDAMOS NUESTRA CONSULTA
    let queryString = "DELETE FROM Usuarios;COMMIT;"
    //CREAMOS EL PUNTERO DE INSTRUCCIÓN
    var deleteStatement: OpaquePointer? = nil

    //PREPARACIÓN DE LA CONSULTA
    if sqlite3_prepare(db, queryString, -1, &deleteStatement, nil) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print(queryString)
        print("error preparing insert: \(errmsg)")
        return
    }
    //ELIMINAMOS LOS REGISTROS
    if sqlite3_prepare_v2(db, queryString, -1, &deleteStatement, nil) == SQLITE_OK {
        if sqlite3_step(deleteStatement) == SQLITE_DONE {
            print("Successfully deleted row.")
        } else {
            print("Could not delete row.")
        }
    } else {
        print("DELETE statement could not be prepared")
    }

    //FINALIZAMOS LA SENTENCIA
    sqlite3_finalize(deleteStatement)
    //insertarAdmin()
}

internal func eliminarUsuario(usu: String)
{
    //GUARDAMOS NUESTRA CONSULTA
    let queryString = "DELETE FROM Usuarios WHERE usuario ='"+usu+"';COMMIT;"
    //CREAMOS EL PUNTERO DE INSTRUCCIÓN
    var deleteStatement: OpaquePointer? = nil

    //PREPARACIÓN DE LA CONSULTA
    if sqlite3_prepare(db, queryString, -1, &deleteStatement, nil) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print(queryString)
        print("error preparing insert: \(errmsg)")
        return
    }
    //ELIMINAMOS LOS REGISTROS
    if sqlite3_prepare_v2(db, queryString, -1, &deleteStatement, nil) == SQLITE_OK {
        if sqlite3_step(deleteStatement) == SQLITE_DONE {
            print("Successfully deleted row.")
        } else {
            print("Could not delete row.")
        }
    } else {
        print("DELETE statement could not be prepared")
    }

    //FINALIZAMOS LA SENTENCIA
    sqlite3_finalize(deleteStatement)
    //insertarAdmin()
}

}

0 个答案:

没有答案