Estoy buscando una forma de acceder a una base de datos SQLite en mi aplicación con código Swift.
Sé que puedo usar un SQLite Wrapper en Objective C y usar el encabezado de puente, pero prefiero poder hacer este proyecto por completo en Swift. ¿Hay alguna manera de hacer esto? Si es así, ¿alguien puede señalarme una referencia que muestre cómo enviar una consulta, recuperar filas, etc.?
let dbPath = try! FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("test.sqlite").path
.Respuestas:
Si bien probablemente debería usar uno de los muchos contenedores de SQLite, si quisiera saber cómo llamar a la biblioteca de SQLite usted mismo, debería:
Configure su proyecto Swift para manejar llamadas SQLite C. Si usa Xcode 9 o posterior, simplemente puede hacer:
Crear / abrir base de datos.
Tenga en cuenta que sé que parece extraño cerrar la base de datos cuando no se abre, pero la
sqlite3_open
documentación deja explícito que debemos hacerlo para evitar fugas de memoria:Úselo
sqlite3_exec
para realizar SQL (por ejemplo, crear una tabla).Úselo
sqlite3_prepare_v2
para preparar SQL con un?
marcador de posición al que vincularemos el valor.Tenga en cuenta que utiliza la
SQLITE_TRANSIENT
constante que se puede implementar de la siguiente manera:Restablezca SQL para insertar otro valor. En este ejemplo, insertaré un
NULL
valor:Finalice la declaración preparada para recuperar la memoria asociada con esa declaración preparada:
Prepare una nueva declaración para seleccionar valores de la tabla y recorra la recuperación de los valores:
Cerrar base de datos:
Para Swift 2 y versiones anteriores de Xcode, consulte las revisiones anteriores de esta respuesta .
fuente
guard
declaraciones en su lugar.Lo mejor que puede hacer es importar la biblioteca dinámica dentro de un encabezado puente:
#import <sqlite3.h>
al principioA continuación, podrá acceder a todos los métodos c como
sqlite3_open
desde su código swift.Sin embargo, es posible que desee utilizar FMDB e importarlo a través del encabezado de puente, ya que es un contenedor más orientado a objetos de sqlite. Tratar con punteros y estructuras de C será engorroso en Swift.
fuente
NSDateFormatter
. Pero mi intención fue menos criticar este aspecto particular de estas implementaciones particulares que sugerir que es indicativo de un problema más amplio, que estas no tienen los años de refinamiento que tienen soluciones como FMDB. Creo que la gente se apresura a descartar las soluciones probadas de Objective-C en favor de implementaciones Swift menos maduras (TFHpple vs NDHpple son otro buen ejemplo).Yo también estaba buscando alguna forma de interactuar con SQLite de la misma manera que estaba acostumbrado a hacerlo anteriormente en Objective-C. Es cierto que, debido a la compatibilidad con C, acabo de usar la API C directa.
Como actualmente no existe un contenedor para SQLite en Swift y el código SQLiteDB mencionado anteriormente va un poco más alto y asume cierto uso, decidí crear un contenedor y familiarizarme un poco con Swift en el proceso. Puede encontrarlo aquí: https://github.com/chrismsimpson/SwiftSQLite .
fuente
He creado una elegante biblioteca SQLite escrita completamente en Swift llamada SwiftData .
Algunas de sus características son:
Proporciona una manera fácil de ejecutar 'cambios' (por ejemplo, INSERT, UPDATE, DELETE, etc.):
y 'consultas' (por ejemplo, SELECT):
¡Junto con muchas más funciones!
Puedes verlo aquí
fuente
Otro contenedor de SQLite para Swift 2 y Swift 3: http://github.com/groue/GRDB.swift
caracteristicas:
Una API que resultará familiar a los usuarios de ccgus / fmdb
Una API de SQLite de bajo nivel que aprovecha la biblioteca estándar de Swift
Una interfaz de consulta bastante rápida para desarrolladores alérgicos a SQL
Soporte para el modo SQLite WAL y acceso concurrente a la base de datos para un rendimiento adicional
Una clase de registro que envuelve conjuntos de resultados, se come sus consultas SQL personalizadas para el desayuno y proporciona operaciones CRUD básicas
Libertad de tipo Swift: elija el tipo Swift correcto que se adapte a sus datos. Use Int64 cuando sea necesario, o quédese con el conveniente Int. Almacene y lea NSDate o NSDateComponents. Declare enumeraciones Swift para tipos de datos discretos. Defina sus propios tipos de bases de datos convertibles.
Migraciones de bases de datos
Velocidad: https://github.com/groue/GRDB.swift/wiki/Performance
fuente
AppDelegate.swift
Database.swift
Model.swift
Base de datos de acceso:
Fuego de consulta de base de datos:
fuente
Esta es, con mucho, la mejor biblioteca SQLite que he usado en Swift: https://github.com/stephencelis/SQLite.swift
Mira los ejemplos de código. Mucho más limpio que la API de C:
La documentación también dice que "SQLite.swift también funciona como un contenedor ligero y compatible con Swift sobre la API C", y sigue con algunos ejemplos de eso.
fuente
He escrito una biblioteca contenedora SQLite3 escrita en Swift .
Este es en realidad un contenedor de muy alto nivel con una API muy simple, pero de todos modos, tiene un código inter-op de C de bajo nivel, y publico aquí una parte (simplificada) para mostrar el inter-op de C.
Si desea un código fuente completo de este contenedor de bajo nivel, consulte estos archivos.
fuente
Configure su proyecto Swift para manejar llamadas SQLite C:
y usó el siguiente código
fuente
A veces, es suficiente una versión rápida del enfoque "SQLite en 5 minutos o menos" que se muestra en sqlite.org . Los "5 minutos o menos" usos de aproximación
sqlite3_exec()
, que es un envoltorio de comodidad parasqlite3_prepare()
,sqlite3_step()
,sqlite3_column()
, ysqlite3_finalize()
.Swift 2.2 puede admitir directamente el
sqlite3_exec()
callback
puntero de función como un procedimiento global que no es de instanciafunc
o un cierre literal sin captura{}
.Legible
typealias
Enfoque de devolución de llamada
Enfoque de cierre
Para preparar un proyecto Xcode para llamar a una biblioteca C como SQLite, es necesario (1) agregar un archivo Bridging-Header.h con encabezados C de referencia como
#import "sqlite3.h"
, (2) agregar Bridging-Header.h a Objective-C Bridging Header en el proyecto y (3) agregarlibsqlite3.tbd
a la configuración de destino de Link Binary With Library .El sqlite.org 's 'SQLite en 5 minutos o menos' ejemplo se implementa en un proyecto Swift Xcode7 aquí .
fuente
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
Si openConnection tuvo éxito, ahora puede hacer una inserción simple en Table AppInfo
¡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.
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.
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.
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.
fuente
También puede configurar SQLite fácilmente con rapidez usando la clase de tonelada única.
Referir
https://github.com/hasyapanchasara/SQLite_SingleManagerClass
Método para crear base de datos
Método para insertar, actualizar y eliminar datos
Método para seleccionar datos
fuente