Puede usar esta biblioteca en Swift para SQLite
https://github.com/pmurphyjam/SQLiteDemo
SQLiteDemo
Demostración de SQLite usando Swift con la clase SQLDataAccess escrita en Swift
Agregar a su proyecto
Solo necesita tres archivos para agregar a su proyecto * SQLDataAccess.swift * DataConstants.swift * Bridging-Header.h Bridging-Header debe establecerse en su proyecto de Xcode 'Objective-C Bridging Header' en 'Swift Compiler - General'
Ejemplos de uso
Simplemente siga el código en ViewController.swift para ver cómo escribir SQL simple con SQLDataAccess.swift Primero debe abrir la base de datos SQLite con la que está tratando
let db = SQLDataAccess.shared
db.setDBName(name:"SQLite.db")
let opened = db.openConnection(copyFile:true)
Si openConnection tuvo éxito, ahora puede hacer una inserción simple en Table AppInfo
//Insert into Table AppInfo
let status = db.executeStatement("insert into AppInfo (name,value,descrip,date) values(?,?,?,?)",
”SQLiteDemo","1.0.2","unencrypted",Date())
if(status)
{
//Read Table AppInfo into an Array of Dictionaries
let results = db.getRecordsForQuery("select * from AppInfo ")
NSLog("Results = \(results)")
}
¡Mira lo simple que fue!
El primer término en db.executeStatement es su SQL como String, todos los términos que siguen son una lista de argumentos variadic de tipo Any, y son sus parámetros en un Array. Todos estos términos están separados por comas en su lista de argumentos SQL. Puede ingresar cadenas, enteros, fechas y blobs justo después de la declaración de la secuela, ya que todos estos términos se consideran parámetros de la secuela. La matriz de argumentos variadic simplemente hace que sea conveniente ingresar toda su secuela en una sola llamada executeStatement o getRecordsForQuery. Si no tiene ningún parámetro, no ingrese nada después de su SQL.
La matriz de resultados es una matriz de diccionarios donde la 'clave' es el nombre de la columna de sus tablas y el 'valor' son sus datos obtenidos de SQLite. Puede iterar fácilmente a través de esta matriz con un bucle for o imprimirlo directamente o asignar estos elementos de diccionario a clases de objetos de datos personalizados que usa en sus controladores de vista para el consumo del modelo.
for dic in results as! [[String:AnyObject]] {
print(“result = \(dic)”)
}
SQLDataAccess almacenará texto, doble, flotante, blob, fecha, entero y enteros largos largos. Para Blobs, puede almacenar binary, varbinary, blob.
Para Texto, puede almacenar char, character, clob, carácter nacional variable, carácter nativo, nchar, nvarchar, varchar, variant, carácter variable, texto.
Para las fechas, puede almacenar fecha y hora, hora, marca de tiempo, fecha.
Para los enteros, puede almacenar bigint, bit, bool, boolean, int2, int8, integer, mediumint, smallint, tinyint, int.
Para dobles, puede almacenar decimal, precisión doble, flotante, numérico, real, doble. Double tiene la mayor precisión.
Incluso puede almacenar Nulls de tipo Null.
En ViewController.swift se hace un ejemplo más complejo que muestra cómo insertar un diccionario como un 'Blob'. Además, SQLDataAccess comprende Swift Date () nativo, por lo que puede insertar estos objetos sin convertir, y los convertirá a texto y los almacenará, y cuando los recupere, los convertirá de texto a Date.
Por supuesto, el verdadero poder de SQLite es su capacidad de transacción. Aquí puede literalmente poner en cola 400 sentencias SQL con parámetros e insertarlas todas a la vez, lo cual es realmente poderoso ya que es muy rápido. ViewController.swift también le muestra un ejemplo de cómo hacer esto. Todo lo que está haciendo realmente es crear una matriz de diccionarios llamada 'sqlAndParams', en esta matriz sus diccionarios de almacenamiento con dos claves 'SQL' para la instrucción o consulta de secuencia de cadenas, y 'PARAMS', que es solo una matriz de objetos nativos SQLite entiende para esa consulta. Cada 'sqlParams', que es un diccionario individual de consultas posteriores más parámetros, se almacena en la matriz 'sqlAndParams'. Una vez que haya creado esta matriz, simplemente llame.
let status = db.executeTransaction(sqlAndParams)
if(status)
{
//Read Table AppInfo into an Array of Dictionaries for the above Transactions
let results = db.getRecordsForQuery("select * from AppInfo ")
NSLog("Results = \(results)")
}
Además, todos los métodos executeStatement y getRecordsForQuery se pueden realizar con una cadena simple para la consulta SQL y una matriz para los parámetros que necesita la consulta.
let sql : String = "insert into AppInfo (name,value,descrip) values(?,?,?)"
let params : Array = ["SQLiteDemo","1.0.0","unencrypted"]
let status = db.executeStatement(sql, withParameters: params)
if(status)
{
//Read Table AppInfo into an Array of Dictionaries for the above Transactions
let results = db.getRecordsForQuery("select * from AppInfo ")
NSLog("Results = \(results)")
}
También existe una versión de Objective-C y se llama el mismo SQLDataAccess, por lo que ahora puede elegir escribir su secuela en Objective-C o Swift. Además, SQLDataAccess también funcionará con SQLCipher, el código actual aún no está configurado para funcionar con él, pero es bastante fácil de hacer, y un ejemplo de cómo hacerlo se encuentra en la versión Objective-C de SQLDataAccess.
SQLDataAccess es una clase muy rápida y eficiente, y se puede usar en lugar de CoreData, que realmente solo usa SQLite como su almacén de datos subyacente sin todas las fallas de integridad de datos centrales de CoreData que vienen con CoreData.