Je recherche un moyen d'accéder à une base de données SQLite dans mon application avec du code Swift.
Je sais que je peux utiliser un SQLite Wrapper dans Objective C et utiliser l'en-tête de pontage, mais je préférerais pouvoir faire ce projet entièrement dans Swift. Existe-t-il un moyen de le faire, si oui, quelqu'un peut-il me diriger vers une référence qui montre comment soumettre une requête, récupérer des lignes, etc.?
let dbPath = try! FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("test.sqlite").path
.Réponses:
Alors que vous devriez probablement utiliser l'un des nombreux wrappers SQLite, si vous vouliez savoir comment appeler la bibliothèque SQLite vous-même, vous:
Configurez votre projet Swift pour gérer les appels SQLite C. Si vous utilisez Xcode 9 ou version ultérieure, vous pouvez simplement faire:
Créer / ouvrir une base de données.
Remarque, je sais qu'il semble étrange de fermer la base de données en cas d'échec de l'ouverture, mais le
sqlite3_open
documentation précise que nous devons le faire pour éviter les fuites de mémoire:Utilisez
sqlite3_exec
pour exécuter SQL (par exemple créer une table).Utilisez
sqlite3_prepare_v2
pour préparer SQL avec?
espace réservé auquel nous lierons la valeur.Notez que cela utilise la
SQLITE_TRANSIENT
constante qui peut être implémentée comme suit:Réinitialisez SQL pour insérer une autre valeur. Dans cet exemple, je vais insérer une
NULL
valeur:Finalisez l'instruction préparée pour récupérer la mémoire associée à cette instruction préparée:
Préparez une nouvelle instruction pour sélectionner les valeurs de la table et bouclez en récupérant les valeurs:
Fermer la base de données:
Pour Swift 2 et les versions antérieures de Xcode, consultez les révisions précédentes de cette réponse .
la source
guard
déclarations à la place.Le mieux que vous puissiez faire est d'importer la bibliothèque dynamique dans un en-tête de pontage:
#import <sqlite3.h>
le en hautVous pourrez alors accéder à toutes les méthodes c comme
sqlite3_open
partir de votre code swift.Cependant, vous voudrez peut-être simplement utiliser FMDB et l'importer via l'en-tête de pontage car il s'agit d'un wrapper plus orienté objet de sqlite. La gestion des pointeurs et des structures C sera fastidieuse dans Swift.
la source
NSDateFormatter
. Mais mon intention était moins de critiquer cet aspect particulier de ces implémentations particulières que de suggérer que cela indique un problème plus large, que celles-ci n'ont pas les années de raffinement que les solutions comme la FMDB ont. Je pense que les gens sont trop prompts à abandonner les solutions Objective-C éprouvées au profit d'implémentations Swift moins matures (TFHpple vs NDHpple sont un autre bon exemple).Moi aussi, je cherchais un moyen d'interagir avec SQLite de la même manière que j'avais l'habitude de faire auparavant en Objective-C. Certes, en raison de la compatibilité C, je viens d'utiliser l'API C simple.
Comme aucun wrapper n'existe actuellement pour SQLite dans Swift et que le code SQLiteDB mentionné ci-dessus va un peu plus haut et suppose une certaine utilisation, j'ai décidé de créer un wrapper et de me familiariser un peu avec Swift dans le processus. Vous pouvez le trouver ici: https://github.com/chrismsimpson/SwiftSQLite .
la source
J'ai créé une élégante bibliothèque SQLite entièrement écrite en Swift appelée SwiftData .
Certaines de ses caractéristiques sont:
Il fournit un moyen simple d'exécuter des 'changements' (par exemple INSERT, UPDATE, DELETE, etc.):
et 'requêtes' (par exemple SELECT):
Avec de nombreuses autres fonctionnalités!
Vous pouvez le vérifier ici
la source
Encore un autre wrapper SQLite pour Swift 2 et Swift 3: http://github.com/groue/GRDB.swift
Fonctionnalités:
Une API qui semblera familière aux utilisateurs de ccgus / fmdb
Une API SQLite de bas niveau qui exploite la bibliothèque standard Swift
Une jolie interface de requête Swift pour les développeurs allergiques à SQL
Prise en charge du mode SQLite WAL et accès simultané à la base de données pour des performances supplémentaires
Une classe Record qui encapsule les ensembles de résultats, mange vos requêtes SQL personnalisées pour le petit-déjeuner et fournit des opérations CRUD de base
Liberté de type Swift: choisissez le type Swift qui correspond à vos données. Utilisez Int64 si nécessaire, ou restez avec le pratique Int. Stockez et lisez NSDate ou NSDateComponents. Déclarez les énumérations Swift pour les types de données discrets. Définissez vos propres types de base de données convertibles.
Migrations de bases de données
Vitesse: https://github.com/groue/GRDB.swift/wiki/Performance
la source
AppDelegate.swift
Database.swift
Modèle.swift
Accéder à la base de données:
feu de requête de base de données:
la source
C'est de loin la meilleure bibliothèque SQLite que j'ai utilisée dans Swift: https://github.com/stephencelis/SQLite.swift
Regardez les exemples de code. Tellement plus propre que l'API C:
La documentation indique également que «SQLite.swift fonctionne également comme un wrapper léger et convivial sur l'API C», et suit avec quelques exemples de cela.
la source
J'ai écrit une bibliothèque de wrapper SQLite3 écrite en Swift .
Il s'agit en fait d'un wrapper de très haut niveau avec une API très simple, mais de toute façon, il a un code d'interopérabilité C de bas niveau, et j'en publie ici une partie (simplifiée) pour montrer l'interopérabilité C.
Si vous voulez un code source complet de ce wrapper de bas niveau, consultez ces fichiers.
la source
Configurez votre projet Swift pour gérer les appels SQLite C:
et utilisé le code suivant
la source
Parfois, une version Swift de l' approche «SQLite en 5 minutes ou moins» présentée sur sqlite.org est suffisante. Les « 5 minutes ou moins » utilisations d'approche
sqlite3_exec()
qui est un emballage pratique poursqlite3_prepare()
,sqlite3_step()
,sqlite3_column()
etsqlite3_finalize()
.Swift 2.2 peut directement prendre en charge le
sqlite3_exec()
callback
pointeur de fonction soit comme une procédure globale, non-instance,func
soit comme une fermeture littérale non capturante{}
.Lisible
typealias
Approche de rappel
Approche de fermeture
Pour préparer un projet Xcode à appeler une bibliothèque C telle que SQLite, il faut (1) ajouter des en-têtes C de référence de fichier Bridging-Header.h comme
#import "sqlite3.h"
, (2) ajouter Bridging-Header.h à Objective-C Bridging Header dans le projet paramètres, et (3) ajouterlibsqlite3.tbd
à Link Binary With Library paramètres cibles .Le sqlite.org de « SQLite en 5 minutes ou moins » par exemple est mis en œuvre dans un projet Swift Xcode7 ici .
la source
Vous pouvez utiliser cette bibliothèque dans Swift pour SQLite https://github.com/pmurphyjam/SQLiteDemo
SQLiteDemo
Démonstration SQLite utilisant Swift avec la classe SQLDataAccess écrite en Swift
Ajout à votre projet
Vous n'avez besoin que de trois fichiers à ajouter à votre projet * SQLDataAccess.swift * DataConstants.swift * Bridging-Header.h Bridging-Header doit être défini dans votre projet Xcode 'Objective-C Bridging Header' sous 'Swift Compiler - General'
Exemples d'utilisation
Suivez simplement le code dans ViewController.swift pour voir comment écrire du SQL simple avec SQLDataAccess.swift Vous devez d'abord ouvrir la base de données SQLite avec laquelle vous traitez
Si openConnection réussit, vous pouvez maintenant faire une simple insertion dans Table AppInfo
Voyez comme c'était simple!
Le premier terme de db.executeStatement est votre SQL sous forme de chaîne, tous les termes qui suivent sont une liste d'arguments variadiques de type Any et sont vos paramètres dans un tableau. Tous ces termes sont séparés par des virgules dans votre liste d'arguments SQL. Vous pouvez entrer des chaînes, des entiers, des dates et des objets blob juste après l'instruction de suite, car tous ces termes sont considérés comme des paramètres de la suite. Le tableau d'arguments variadiques permet simplement de saisir toute votre suite en un seul appel executeStatement ou getRecordsForQuery. Si vous n'avez aucun paramètre, n'entrez rien après votre SQL.
Le tableau de résultats est un tableau de dictionnaires où la «clé» est le nom de la colonne de votre table et la «valeur» est vos données obtenues à partir de SQLite. Vous pouvez facilement parcourir ce tableau avec une boucle for ou l'imprimer directement ou affecter ces éléments Dictionary à des classes d'objets de données personnalisées que vous utilisez dans vos contrôleurs d'affichage pour la consommation de modèles.
SQLDataAccess stockera, texte, double, flottant, blob, date, entier et longs entiers longs. Pour les objets blob, vous pouvez stocker des objets binaires, varbinary, blob.
Pour le texte, vous pouvez stocker char, caractère, clob, caractère variant national, caractère natif, nchar, nvarchar, varchar, variante, caractère variable, texte.
Pour les dates, vous pouvez stocker la date, l'heure, l'horodatage et la date.
Pour les entiers, vous pouvez stocker bigint, bit, bool, boolean, int2, int8, integer, mediumint, smallint, tinyint, int.
Pour les doubles, vous pouvez stocker des nombres décimaux, double précision, flottants, numériques, réels, doubles. Double a le plus de précision.
Vous pouvez même stocker des Nulls de type Null.
Dans ViewController.swift, un exemple plus complexe montre comment insérer un dictionnaire en tant que «Blob». En outre, SQLDataAccess comprend la date Swift native () afin que vous puissiez insérer ces objets sans conversion, et il les convertira en texte et les stockera, et une fois récupérés, les reconvertira du texte en date.
Bien sûr, la vraie puissance de SQLite est sa capacité de transaction. Ici, vous pouvez littéralement mettre en file d'attente 400 instructions SQL avec des paramètres et les insérer toutes en même temps, ce qui est vraiment puissant car c'est si rapide. ViewController.swift vous montre également un exemple de la façon de procéder. Tout ce que vous faites vraiment est de créer un tableau de dictionnaires appelé 'sqlAndParams', dans ce tableau, vos dictionnaires de stockage avec deux clés 'SQL' pour l'instruction ou la requête String sequel, et 'PARAMS' qui est juste un tableau d'objets natifs SQLite comprend pour cette requête. Chaque 'sqlParams' qui est un dictionnaire individuel de la requête de suite et des paramètres est ensuite stocké dans le tableau 'sqlAndParams'. Une fois que vous avez créé ce tableau, il vous suffit d'appeler.
En outre, toutes les méthodes executeStatement et getRecordsForQuery peuvent être effectuées avec une simple String pour une requête SQL et un tableau pour les paramètres nécessaires à la requête.
Une version Objective-C existe également et s'appelle le même SQLDataAccess, vous pouvez donc maintenant choisir d'écrire votre suite en Objective-C ou Swift. De plus, SQLDataAccess fonctionnera également avec SQLCipher, le code actuel n'est pas encore configuré pour fonctionner avec lui, mais c'est assez facile à faire, et un exemple de la façon de le faire se trouve en fait dans la version Objective-C de SQLDataAccess.
SQLDataAccess est une classe très rapide et efficace, et peut être utilisée à la place de CoreData qui utilise vraiment juste SQLite car c'est le magasin de données sous-jacent sans tous les pannes d'intégrité des données CoreData qui accompagnent CoreData.
la source
Vous pouvez également facilement configurer SQLite avec swift en utilisant une classe de tonne unique.
Référer
https://github.com/hasyapanchasara/SQLite_SingleManagerClass
Méthode pour créer une base de données
Méthode pour insérer, mettre à jour et supprimer des données
Méthode de sélection des données
la source