L'accès à une Base de données SQLite en Swift
Je suis à la recherche d'un moyen d'accéder à une base de données SQLite dans mon application avec le code Swift.
Je sais que je peux utiliser un SQLite Wrapper en C Objectif et l'utilisation du pont d'en-tête, mais je préfère être en mesure de faire ce projet entièrement en Swift. Est-il un moyen de le faire, si oui, quelqu'un peut-il m'indiquer une référence qui montre comment soumettre une requête, extraire des lignes, etc?
OriginalL'auteur Jase | 2014-06-08
Vous devez vous connecter pour publier un commentaire.
Alors vous devriez probablement utiliser l'un des nombreux SQLite wrappers (je préfère FMDB, moi-même), si vous avez voulu savoir comment appeler la bibliothèque SQLite vous-même, vous:
Configurer votre Swift projet pour gérer SQLite C appels. Si l'utilisation de Xcode 9, vous pouvez tout simplement faire:
Dans les précédentes versions de Xcode, vous pouvez:
Créer de transition fichier d'en-tête pour le projet. Voir la l'Importation d'Objective-C dans Swift section de la L'utilisation de Swift avec Cocoa et Objective-C. Cette passerelle en-tête doit importer
sqlite3.h
:Ajouter le
libsqlite3.tbd
(ou même pour les anciennes versions, lalibsqlite3.dylib
) à votre projet:Créer ou ouvrir une base de données.
Utilisation
sqlite3_exec
pour exécuter SQL (par exemple create table).Utilisation
sqlite3_prepare_v2
préparer SQL avec?
espace réservé à laquelle nous allons lier valeur.Note, qui utilise le
SQLITE_TRANSIENT
constante qui peut être mis en œuvre comme suit:Réinitialiser SQL pour insérer une autre valeur. Dans cet exemple, je vais insérer un
NULL
valeur:Finaliser l'instruction préparée pour récupérer de la mémoire associés à ce communiqué:
Préparer la nouvelle instruction pour la sélection des valeurs du tableau et une boucle dans l'extraction de valeurs:
À proximité de la base de données:
Pour Swift 2, voir de la révision précédente date de cette réponse.
Dieu vous bénisse homme...
Serait-il mieux de nest le si (... == SQLITE_OK), de sorte que la suite ne serait pas exécutée si elle a échoué. Je suis purement demande parce que je suis très nouveau à cela et était juste curieux de savoir si vous avez fait cela pour des fins d'enseignement.
Bien sûr, mais si vous le faites avec beaucoup de SQLite appels, vous vous retrouvez avec un code qui est vraiment profondément imbriqués. Si vous êtes inquiet à ce sujet, je serais probablement utiliser
guard
plutôt les instructions.B Jorge, j'ai tout fait, avez-vous aussi besoin d'importer en quelque sorte de transition de l'en-tête ? Je suis en train de travailler dans la classe de test
OriginalL'auteur Rob
Le meilleur que vous pouvez faire est d'importer la bibliothèque dynamique à l'intérieur d'un pontage en-tête:
#import <sqlite3.h>
vers le hautVous pourrez alors accéder à toutes les méthodes c comme
sqlite3_open
à partir de votre code swift.Cependant, vous voulez juste utiliser FMDB et à l'importation qu'à travers la transition de l'en-tête qui est plus orienté objet wrapper de sqlite. Traiter avec C les pointeurs et les structures seront lourdes dans la Swift.
aussi tout le monde et leur père a maintenant créé une Swift wrapper.. voir ci-dessous
Malheureusement, aucun d'entre eux sont terriblement mature, donc si vous utilisez l'un de ces nouveaux emballages, être prudent. Par exemple, au moment de l'écriture, j'ai jeté un coup d'oeil à quatre, et trois traités dates de manière incorrecte et le quatrième n'a pas de manipuler à tous.
Avez-vous regardé github.com/stephencelis/SQLite.swift#readme ? D'informations sur la configuration à utiliser avec NSDate ici: github.com/stephencelis/SQLite.swift/blob/master/Documentation/...
Hé, c'est mieux que la plupart d'entre eux, parce qu'au moins, vous spécifiez le fuseau horaire, mais j'ai encore avec qui
NSDateFormatter
. Mais mon intention était de moins en moins à critiquer cet aspect particulier de ces implémentations de suggérer que son indicatif d'un problème plus vaste, que ce n'est pas les années de raffinement que des solutions comme FMDB ont. Je pense que les gens sont trop prompts à les jeter prouvé Objective-C solutions en faveur de moins matures mises en oeuvre de Swift (TFHpple vs NDHpple sont un autre bon exemple).OriginalL'auteur drewag
Je recherchais une certaine façon d'interagir avec SQLite de la même façon, j'avais l'habitude de le faire auparavant en Objective-C. Certes, à cause de C de compatibilité, j'ai simplement utilisé le droit de l'API C.
Que pas de wrapper existe actuellement pour SQLite rapide et la SQLiteDB code mentionné ci-dessus va un peu plus haut niveau et n'assume certaines utilisations, j'ai décidé de créer un wrapper et être un peu plus familier avec Swift dans le processus. Vous pouvez le trouver ici: https://github.com/chrismsimpson/SwiftSQLite.
OriginalL'auteur Chris Simpson
J'ai créé une élégante bibliothèque SQLite entièrement écrite en Swift appelé SwiftData.
Certaines de ses fonctions sont:
Il fournit un moyen facile d'exécuter des "changements" (par exemple, INSERT, UPDATE, DELETE, etc.):
et "requêtes" (par exemple, SELECT):
Avec beaucoup plus de fonctionnalités!
Vous pouvez le vérifier ici
OriginalL'auteur ryanfowler
Encore un autre SQLite wrapper pour Swift 2 et Swift 3: http://github.com/groue/GRDB.swift
Caractéristiques:
Une API qui sera familier pour les utilisateurs de ccgus/fmdb
Un bas niveau de l'API SQLite, qui tire parti de la Swift de la bibliothèque standard
Une jolie Swift interface de requête de SQL-allergique développeurs
De soutien pour l'SQLite WAL mode, et de la base de données simultanées d'accès pour plus de performance
Un Record de classe qui encapsule des ensembles de résultats, mange tes requêtes SQL personnalisées pour le petit déjeuner, et fournit de base opérations CRUD
Swift type de liberté: choisir la bonne Swift type qui s'adapte à vos données. Utilisation Int64 cas de besoin, ou s'en tenir à la pratique de l'Int. De stocker et de lire NSDate ou NSDateComponents. Déclarer Swift enums pour les types de données discrètes. Définir votre propre base de données-type convertible.
Migrations De Base De Données
Vitesse: https://github.com/groue/GRDB.swift/wiki/Performance
OriginalL'auteur Gwendal Roué
AppDelegate.swift
Base de données.swift
Modèle.swift
Base de données Access :
Requête de base de données feu :
OriginalL'auteur Jayesh Miruliya
J'ai écrit un SQLite3 wrapper bibliothèque écrite en Swift.
C'est en fait un très haut niveau wrapper avec de très simple API, mais de toute façon, il a un faible niveau C inter-op de code, et je poste ici un (simplifié) partie montre la C inter-op.
Si vous voulez un code source complet de ce faible niveau de wrapper, voir ces fichiers.
OriginalL'auteur Eonil
Configurer votre Swift projet pour gérer SQLite C appels:
et utilisé le code suivant
OriginalL'auteur chirag shah
Parfois, un Swift version de la "SQLite en 5 minutes ou moins" approche indiqué sur sqlite.org est suffisant.
Le "5 minutes ou moins" approche utilise
sqlite3_exec()
qui est une commodité wrapper poursqlite3_prepare()
,sqlite3_step()
,sqlite3_column()
, etsqlite3_finalize()
.Swift 2.2 pouvez appuyer directement les
sqlite3_exec()
callback
pointeur de fonction, soit un global, la non-occurrence de procédurefunc
ou un non-capture littérale fermeture{}
.Lisible
typealias
Rappel Approche
Fermeture Approche
De préparer un projet Xcode pour appeler une bibliothèque C comme SQLite, on a besoin de (1) ajouter un pont-d'en-Tête.h fichier de référence C-têtes comme
#import "sqlite3.h"
, (2) ajouter des Transition en-Tête.h à Objective-C de Transition de l'en-Tête dans les paramètres du projet, et (3) d'ajouterlibsqlite3.tbd
à Lien Binaire Avec la Bibliothèque les paramètres de la cible.La sqlite.org's "SQLite en 5 minutes ou moins" exemple est mis en œuvre dans un Swift Xcode7 projet ici.
OriginalL'auteur l --marc l
Vous pouvez easlity configurer SQLite avec swift utilisant une seule tonne de classe.
Reportez-vous
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 pour sélectionner les données
OriginalL'auteur Hasya
Vous pouvez utiliser cette bibliothèque dans Swift pour SQLite
https://github.com/pmurphyjam/SQLiteDemo
SQLiteDemo
SQLite de Démonstration de l'utilisation de Swift avec SQLDataAccess classe écrite en Swift
De les ajouter à Votre Projet
Vous avez seulement besoin de trois fichiers à ajouter à votre projet
* SQLDataAccess.swift
* DataConstants.swift
* Combler L'En-Tête.h
Transition-d'en-Tête doit être réglé dans votre Xcode du projet 'Objective-C de Transition de l'en-Tête' de la rubrique 'Swift Compilateur Général"
Exemples d'Utilisation des
Il suffit de suivre le code de la ViewController.swift pour voir comment écrire de simples SQL avec SQLDataAccess.swift
Vous devez d'abord ouvrir la Base de données SQLite votre affaire avec
Si openConnection réussi, maintenant vous pouvez faire une simple insertion dans la Table AppInfo
Voir comment simple qui a été!
Le premier terme dans la db.executeStatement est votre SQL as String, tous les termes qui suivent sont une variadic de la liste d'arguments de type Aucun, et vos paramètres dans un Tableau. Tous ces termes sont séparés par des virgules dans votre liste de SQL arguments. Vous pouvez saisir des Chaînes de caractères, Entiers, la Date, et les Blobs juste après la suite de la déclaration puisque toutes ces conditions sont considérées comme des paramètres pour la suite. Les variadic tableau d'arguments tout à fait commode pour saisir toutes vos suite en seulement une executeStatement ou getRecordsForQuery appel. Si vous n'avez pas tous les paramètres, de ne pas entrer quoi que ce soit après votre SQL.
Les résultats de tableau est un tableau de Dictionnaire est là que la " clé "est vos tables nom de la colonne, 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 céder ces Dictionnaire des éléments de données personnalisées des Classes d'objets que vous utilisez, à votre avis, les Contrôleurs pour le modèle de consommation.
SQLDataAccess permettra de stocker, de texte, double, float, blob, la Date, le type integer et long long entiers.
Pour les objets Blob, vous pouvez stocker binary, varbinary, blob.
Pour le Texte que vous pouvez stocker char, le caractère, clob, national variant de caractère, natif de caractère, nchar, nvarchar, varchar, variante, variant de caractère, texte.
Pour les Dates, vous pouvez stocker datetime, time, timestamp, date.
Pour les Entiers, vous pouvez stocker bigint, bits, boolean, boolean, int2, int8, entier, mediumint, smallint, tinyint, int.
Pour les Doubles, vous pouvez stocker virgule, double précision, float, numérique, real, double. Double a le plus de précision.
Vous pouvez même stocker les valeurs Null de type Null.
Dans ViewController.swift un exemple plus complexe est fait montrer comment insérer un Dictionnaire comme un "Blob". En outre SQLDataAccess
comprend natif Swift Date() de sorte que vous pouvez insérer ces objets avec la conversion, et il va les convertir en texte et de les stocker,
et lorsqu'elles sont récupérées à convertir de texte à ce Jour.
Bien sûr, la véritable puissance de SQLite est-il de la capacité de Transaction. Ici vous pouvez littéralement file d'attente jusqu'à 400 instructions SQL avec des paramètres
et insérez-les tous à la fois, ce qui est vraiment puissant puisqu'il est si rapide. ViewController.swift également vous montre un exemple de comment faire cela.
Tout ce que vous êtes vraiment en train de faire est de créer un Tableau de Dictionnaires appelé "sqlAndParams", dans ce Tableau de votre stockage de Dictionnaires avec deux clés
'SQL' pour la Chaîne de suite instruction ou de la requête, et 'PARAMS' qui est juste un Tableau d'objets natifs SQLite comprend pour cette requête.
Chaque "sqlParams" qui est un particulier Dictionnaire de la suite de la requête, plus les paramètres sont ensuite stockées dans le " sqlAndParams le Tableau.
Une fois que vous avez créé ce tableau, il vous suffit d'appeler.
En outre, tous les executeStatement et getRecordsForQuery méthodes peut être fait avec une simple Chaîne de requête SQL et un Tableau pour les paramètres nécessaires par la requête.
Objective-C version existe aussi et est appelé le même SQLDataAccess, alors maintenant vous pouvez choisir de rédiger votre suite en Objective-C ou Swift.
En outre SQLDataAccess travaillera également avec SQLCipher, le présent code n'est pas d'installation mais de travailler avec elle, mais c'est assez facile à faire, et
un exemple de la façon de le faire est en fait dans l'Objective-C est la version de SQLDataAccess.
SQLDataAccess est très rapide et efficace de la classe, et peut être utilisé à la place de CoreData qui utilise SQLite comme c'est sous-jacente des données
magasin sans tous les CoreData de base de l'intégrité des données faute accidents qui viennent avec CoreData.
OriginalL'auteur Frost