Estou procurando uma maneira de acessar um banco de dados SQLite em meu aplicativo com o código Swift.
Eu sei que posso usar um Wrapper SQLite em Objective C e usar o cabeçalho de ponte, mas prefiro poder fazer esse projeto inteiramente em Swift. Existe uma maneira de fazer isso, em caso afirmativo, alguém pode me indicar uma referência que mostra como enviar uma consulta, recuperar linhas, etc?
let dbPath = try! FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("test.sqlite").path
.Respostas:
Embora você provavelmente deva usar um dos muitos wrappers SQLite, se quiser saber como chamar a biblioteca SQLite por conta própria, você deve:
Configure seu projeto Swift para lidar com chamadas SQLite C. Se estiver usando o Xcode 9 ou posterior, você pode simplesmente fazer:
Criar / abrir banco de dados.
Note, eu sei que parece estranho fechar o banco de dados em caso de falha ao abrir, mas a
sqlite3_open
documentação deixa explícito que devemos fazer isso para evitar vazamento de memória:Use
sqlite3_exec
para executar SQL (por exemplo, criar tabela).Use
sqlite3_prepare_v2
para preparar SQL com?
espaço reservado ao qual vincularemos o valor.Observe que isso usa a
SQLITE_TRANSIENT
constante que pode ser implementada da seguinte forma:Redefina o SQL para inserir outro valor. Neste exemplo, irei inserir um
NULL
valor:Finalize a declaração preparada para recuperar a memória associada a essa declaração preparada:
Prepare uma nova instrução para selecionar valores da tabela e percorra a recuperação dos valores:
Fechar banco de dados:
Para Swift 2 e versões anteriores do Xcode, consulte as revisões anteriores desta resposta .
fonte
guard
declarações.O melhor que você pode fazer é importar a biblioteca dinâmica dentro de um cabeçalho de ponte:
#import <sqlite3.h>
ao topoVocê poderá então acessar todos os métodos c, como a
sqlite3_open
partir do seu código swift.No entanto, você pode apenas querer usar FMDB e importá-lo por meio do cabeçalho de ponte, pois é um wrapper mais orientado a objetos do sqlite. Lidar com ponteiros e estruturas C será complicado no Swift.
fonte
NSDateFormatter
. Mas minha intenção era menos criticar esse aspecto particular dessas implementações particulares do que sugerir que isso é indicativo de um problema mais amplo, que eles não têm os anos de refinamento que soluções como o FMDB têm. Acho que as pessoas são muito rápidas em descartar soluções comprovadas de Objective-C em favor de implementações menos maduras do Swift (TFHpple vs NDHpple são outro bom exemplo).Eu também estava procurando alguma maneira de interagir com o SQLite da mesma forma que estava acostumado a fazer anteriormente em Objective-C. É certo que, por causa da compatibilidade com C, acabei de usar a API C simples.
Como nenhum wrapper existe atualmente para SQLite em Swift e o código SQLiteDB mencionado acima vai um pouco mais alto e assume certo uso, decidi criar um wrapper e me familiarizar um pouco com Swift no processo. Você pode encontrá-lo aqui: https://github.com/chrismsimpson/SwiftSQLite .
fonte
Eu criei uma elegante biblioteca SQLite escrita completamente em Swift chamada SwiftData .
Alguns de seus recursos são:
Ele fornece uma maneira fácil de executar 'alterações' (por exemplo, INSERT, UPDATE, DELETE, etc.):
e 'consultas' (por exemplo, SELECT):
Junto com muitos outros recursos!
Você pode conferir aqui
fonte
Mais um wrapper SQLite para Swift 2 e Swift 3: http://github.com/groue/GRDB.swift
Recursos:
Uma API que parecerá familiar para usuários de ccgus / fmdb
Uma API SQLite de baixo nível que aproveita a biblioteca padrão Swift
Uma interface de consulta bem Swift para desenvolvedores alérgicos a SQL
Suporte para o modo SQLite WAL e acesso simultâneo ao banco de dados para desempenho extra
Uma classe Record que agrupa conjuntos de resultados, come suas consultas SQL personalizadas no café da manhã e fornece operações CRUD básicas
Liberdade de tipo Swift: escolha o tipo Swift certo que se adapta aos seus dados. Use Int64 quando necessário ou use o conveniente Int. Armazene e leia NSDate ou NSDateComponents. Declare enums do Swift para tipos de dados discretos. Defina seus próprios tipos conversíveis de banco de dados.
Migrações de banco de dados
Velocidade: https://github.com/groue/GRDB.swift/wiki/Performance
fonte
AppDelegate.swift
Database.swift
Model.swift
Banco de dados de acesso:
Incêndio de consulta de banco de dados:
fonte
Esta é de longe a melhor biblioteca SQLite que usei em Swift: https://github.com/stephencelis/SQLite.swift
Veja os exemplos de código. Muito mais limpo do que a API C:
A documentação também diz que "SQLite.swift também funciona como um wrapper leve e amigável ao Swift sobre a API C" e segue com alguns exemplos disso.
fonte
Eu escrevi uma biblioteca de invólucro SQLite3 escrita em Swift .
Na verdade, este é um wrapper de nível muito alto com API muito simples, mas de qualquer maneira, ele tem código de interoperabilidade C de baixo nível, e eu posto aqui uma parte (simplificada) dele para mostrar a interoperabilidade C.
Se você quiser um código-fonte completo deste wrapper de baixo nível, consulte estes arquivos.
fonte
Configure seu projeto Swift para lidar com chamadas SQLite C:
e usado o seguinte código
fonte
Às vezes, uma versão Swift da abordagem "SQLite em 5 minutos ou menos" mostrada em sqlite.org é suficiente. Os "5 minutos ou menos" usos abordagem
sqlite3_exec()
que é um invólucro de conveniência parasqlite3_prepare()
,sqlite3_step()
,sqlite3_column()
esqlite3_finalize()
.O Swift 2.2 pode suportar diretamente o
sqlite3_exec()
callback
ponteiro de função como um procedimento global, não de instânciafunc
ou um fechamento literal de não captura{}
.Legível
typealias
Abordagem de retorno de chamada
Abordagem de Fechamento
Para preparar um projeto Xcode para chamar uma biblioteca C, como SQLite, é necessário (1) adicionar cabeçalhos C de referência de arquivo Bridging-Header.h como
#import "sqlite3.h"
, (2) adicionar Bridging-Header.h ao cabeçalho de ponte Objective-C no projeto e (3) adicionarlibsqlite3.tbd
às configurações de destino Vincular binário à biblioteca .O sqlite.org 's 'SQLite em 5 minutos ou menos' exemplo é implementado em um projeto Swift Xcode7 aqui .
fonte
Você pode usar esta biblioteca em Swift para SQLite https://github.com/pmurphyjam/SQLiteDemo
SQLiteDemo
SQLite Demo usando Swift com classe SQLDataAccess escrita em Swift
Adicionando ao seu projeto
Você só precisa de três arquivos para adicionar ao seu projeto * SQLDataAccess.swift * DataConstants.swift * Bridging-Header.h Bridging-Header deve ser definido no projeto do Xcode 'Objective-C Bridging Header' em 'Compilador Swift - Geral'
Exemplos de uso
Basta seguir o código em ViewController.swift para ver como escrever SQL simples com SQLDataAccess.swift Primeiro você precisa abrir o banco de dados SQLite com o qual está lidando
Se openConnection for bem-sucedido, agora você pode fazer uma inserção simples na Tabela AppInfo
Veja como foi simples!
O primeiro termo em db.executeStatement é seu SQL como String, todos os termos que se seguem são uma lista de argumentos variadic do tipo Any e são seus parâmetros em um Array. Todos esses termos são separados por vírgulas em sua lista de argumentos SQL. Você pode inserir Strings, Integers, Date's e Blobs logo após a instrução de sequência, pois todos esses termos são considerados parâmetros para a sequência. A matriz de argumento variadic apenas torna conveniente inserir toda a sua sequência em apenas uma chamada executeStatement ou getRecordsForQuery. Se você não tiver nenhum parâmetro, não insira nada após seu SQL.
A matriz de resultados é uma Matriz de Dicionário, onde a 'chave' é o nome da coluna da sua tabela, e o 'valor' são os seus dados obtidos do SQLite. Você pode iterar facilmente por meio desse array com um loop for ou imprimi-lo diretamente ou atribuir esses elementos Dictionary a classes de objetos de dados personalizados que você usa em seus controladores de visualização para consumo de modelo.
SQLDataAccess armazenará texto, duplo, flutuante, blob, data, inteiro e inteiros longos longos. Para Blobs, você pode armazenar binary, varbinary, blob.
Para Texto, você pode armazenar char, caractere, clob, caractere variável nacional, caractere nativo, nchar, nvarchar, varchar, variante, caractere variável, texto.
Para datas, você pode armazenar datetime, time, timestamp, date.
Para inteiros, você pode armazenar bigint, bit, bool, boolean, int2, int8, inteiro, mediumint, smallint, tinyint, int.
Para Doubles, você pode armazenar decimal, precisão dupla, float, numérico, real, duplo. Double tem mais precisão.
Você pode até armazenar Nulls do tipo Null.
Em ViewController.swift, um exemplo mais complexo é feito mostrando como inserir um Dicionário como um 'Blob'. Além disso, SQLDataAccess entende Swift Date () nativo para que você possa inserir esses objetos sem conversão e irá convertê-los em texto e armazená-los e, quando recuperado, convertê-los de volta de texto em Date.
Claro que o verdadeiro poder do SQLite é sua capacidade de transação. Aqui você pode literalmente enfileirar 400 instruções SQL com parâmetros e inseri-los todos de uma vez, o que é realmente poderoso, pois é muito rápido. ViewController.swift também mostra um exemplo de como fazer isso. Tudo o que você realmente está fazendo é criar um Array de Dicionários chamado 'sqlAndParams', neste Array seus Dicionários de armazenamento com duas chaves 'SQL' para a instrução ou consulta de sequência String e 'PARAMS' que é apenas um Array de objetos nativos SQLite entende por essa consulta. Cada 'sqlParams', que é um dicionário individual de consulta sequencial mais parâmetros, é então armazenado no array 'sqlAndParams'. Depois de criar esse array, basta chamar.
Além disso, todos os métodos executeStatement e getRecordsForQuery podem ser feitos com String simples para consulta SQL e um Array para os parâmetros necessários à consulta.
Uma versão Objective-C também existe e é chamada de mesmo SQLDataAccess, então agora você pode escolher escrever sua sequência em Objective-C ou Swift. Além disso, SQLDataAccess também funcionará com SQLCipher, o código presente ainda não foi configurado para funcionar com ele, mas é muito fácil de fazer, e um exemplo de como fazer isso está na versão Objective-C de SQLDataAccess.
SQLDataAccess é uma classe muito rápida e eficiente, e pode ser usada no lugar de CoreData, que realmente usa SQLite como seu armazenamento de dados subjacente, sem todas as falhas de integridade de dados do núcleo CoreData que vêm com CoreData.
fonte
Você pode configurar facilmente o SQLite com o swift usando a classe de tonelada única também.
Referir
https://github.com/hasyapanchasara/SQLite_SingleManagerClass
Método para criar banco de dados
Método para inserir, atualizar e excluir dados
Método para selecionar dados
fonte