我在一个在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()
}
}