[Action GitHub] [Rapport de couverture de code]
Utilisez l'un de ces packages :
Version | Emballer | Description |
---|---|---|
sqlite-net-pcl | Bibliothèque standard .NET | |
sqlite-net-sqlcipher | Avec prise en charge du cryptage | |
sqlite-net-statique | Version spéciale qui utilise P/Invokes vers sqlite3 fourni par la plateforme | |
sqlite-net-base | sans bundle SQLitePCLRaw afin que vous puissiez choisir votre propre fournisseur |
SQLite-net est une bibliothèque minimale open source permettant aux applications .NET, .NET Core et Mono de stocker des données dans des bases de données SQLite 3. Il a d'abord été conçu pour fonctionner avec Xamarin.iOS, mais a depuis grandi pour fonctionner sur toutes les plateformes (Xamarin.*, .NET, UWP, Azure, etc.).
SQLite-net a été conçu comme une couche de base de données rapide et pratique. Sa conception découle de ces objectifs :
Très facile à intégrer aux projets existants et fonctionne sur toutes les plateformes .NET.
Wrapper mince sur SQLite, rapide et efficace. (Cette bibliothèque ne devrait pas constituer un goulot d'étranglement en termes de performances de vos requêtes.)
Méthodes très simples pour exécuter des opérations et des requêtes CRUD en toute sécurité (à l'aide de paramètres) et pour récupérer les résultats de ces requêtes de manière fortement typée.
Fonctionne avec votre modèle de données sans vous obliger à modifier vos classes. (Contient une petite couche ORM basée sur la réflexion.)
Installez sqlite-net-pcl à partir de NuGet.
Important : vous devrez ajouter le package NuGet à la fois à votre projet de bibliothèque .NET Standard et à votre projet d'application dépendant de la plate-forme .
SQLite-net est entièrement contenu dans 1 fichier (je sais, c'est cool, non ?) et est facile à ajouter à votre projet. Ajoutez simplement SQLite.cs à votre projet et vous êtes prêt à commencer à créer des tables. Une implémentation asynchrone peut être trouvée dans SQLiteAsync.cs.
Il s'agit d'un projet open source qui accueille les contributions/suggestions/rapports de bogues de ceux qui l'utilisent. Si vous avez des idées sur la façon d'améliorer la bibliothèque, veuillez publier un problème ici sur GitHub. Veuillez consulter la section Comment contribuer.
Veuillez consulter le Wiki pour, euh, une documentation complète.
La bibliothèque contient des attributs simples que vous pouvez utiliser pour contrôler la construction des tables. Dans un programme de stock simple, vous pouvez utiliser :
public class Stock
{
[ PrimaryKey , AutoIncrement ]
public int Id { get ; set ; }
public string Symbol { get ; set ; }
}
public class Valuation
{
[ PrimaryKey , AutoIncrement ]
public int Id { get ; set ; }
[ Indexed ]
public int StockId { get ; set ; }
public DateTime Time { get ; set ; }
public decimal Price { get ; set ; }
[ Ignore ]
public string IgnoreField { get ; set ; }
}
Une fois que vous avez défini les objets de votre modèle, vous disposez d'un choix d'API. Vous pouvez utiliser « l'API synchrone » où les appels bloquent un par un, ou vous pouvez utiliser « l'API asynchrone » où les appels ne bloquent pas. Vous souhaiterez peut-être utiliser l'API asynchrone pour les applications mobiles afin d'augmenter la réactivité.
Les deux API sont expliquées dans les deux sections ci-dessous.
Une fois que vous avez défini votre entité, vous pouvez générer automatiquement des tables dans votre base de données en appelant CreateTable
:
// Get an absolute path to the database file
var databasePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . MyDocuments ) , " MyData.db " ) ;
var db = new SQLiteConnection ( databasePath ) ;
db . CreateTable < Stock > ( ) ;
db . CreateTable < Valuation > ( ) ;
Vous pouvez insérer des lignes dans la base de données en utilisant Insert
. Si la table contient une clé primaire auto-incrémentée, la valeur de cette clé sera disponible après l'insertion :
public static void AddStock ( SQLiteConnection db , string symbol ) {
var stock = new Stock ( ) {
Symbol = symbol
} ;
db . Insert ( stock ) ;
Console . WriteLine ( " {0} == {1} " , stock . Symbol , stock . Id ) ;
}
Des méthodes similaires existent pour Update
et Delete
.
Le moyen le plus simple d’interroger des données consiste à utiliser la méthode Table
. Cela peut prendre des prédicats pour contraindre via des clauses WHERE et/ou ajouter des clauses ORDER BY :
var query = db . Table < Stock > ( ) . Where ( v => v . Symbol . StartsWith ( " A " ) ) ;
foreach ( var stock in query )
Console . WriteLine ( " Stock: " + stock . Symbol ) ;
Vous pouvez également interroger la base de données à un niveau inférieur à l'aide de la méthode Query
:
public static IEnumerable < Valuation > QueryValuations ( SQLiteConnection db , Stock stock ) {
return db . Query < Valuation > ( " select * from Valuation where StockId = ? " , stock . Id ) ;
}
Le paramètre générique de la méthode Query
spécifie le type d'objet à créer pour chaque ligne. Il peut s'agir de l'une de vos classes de table ou de toute autre classe dont les propriétés publiques correspondent à la colonne renvoyée par la requête. Par exemple, nous pourrions réécrire la requête ci-dessus comme suit :
public class Val
{
public decimal Money { get ; set ; }
public DateTime Date { get ; set ; }
}
public static IEnumerable < Val > QueryVals ( SQLiteConnection db , Stock stock ) {
return db . Query < Val > ( " select " Price " as " Money " , " Time " as " Date " from Valuation where StockId = ? " , stock . Id ) ;
}
Vous pouvez effectuer des mises à jour de bas niveau de la base de données à l'aide de la méthode Execute
.
La bibliothèque asynchrone utilise la bibliothèque parallèle de tâches (TPL). En tant que tel, l'utilisation normale des objets Task
et les mots-clés async
et await
fonctionneront pour vous.
Une fois que vous avez défini votre entité, vous pouvez générer automatiquement des tables en appelant CreateTableAsync
:
// Get an absolute path to the database file
var databasePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . MyDocuments ) , " MyData.db " ) ;
var db = new SQLiteAsyncConnection ( databasePath ) ;
await db . CreateTableAsync < Stock > ( ) ;
Console . WriteLine ( " Table created! " ) ;
Vous pouvez insérer des lignes dans la base de données en utilisant Insert
. Si la table contient une clé primaire auto-incrémentée, la valeur de cette clé sera disponible après l'insertion :
var stock = new Stock ( )
{
Symbol = " AAPL "
} ;
await db . InsertAsync ( stock ) ;
Console . WriteLine ( " Auto stock id: {0} " , stock . Id ) ;
Des méthodes similaires existent pour UpdateAsync
et DeleteAsync
.
La requête de données s'effectue plus simplement à l'aide de la méthode Table
. Cela renverra une instance AsyncTableQuery
, après quoi vous pourrez ajouter des prédicats pour la contrainte via des clauses WHERE et/ou en ajoutant ORDER BY. La base de données n'est pas physiquement touchée jusqu'à ce que l'une des méthodes de récupération spéciales - ToListAsync
, FirstAsync
ou FirstOrDefaultAsync
- soit appelée.
var query = db . Table < Stock > ( ) . Where ( s => s . Symbol . StartsWith ( " A " ) ) ;
var result = await query . ToListAsync ( ) ;
foreach ( var s in result )
Console . WriteLine ( " Stock: " + s . Symbol ) ;
Il existe un certain nombre de méthodes de bas niveau disponibles. Vous pouvez également interroger la base de données directement via la méthode QueryAsync
. Au-delà des opérations de modification fournies par InsertAsync
, etc., vous pouvez émettre des méthodes ExecuteAsync
pour modifier des ensembles de données directement dans la base de données.
Une autre méthode utile est ExecuteScalarAsync
. Cela vous permet de renvoyer facilement une valeur scalaire de la base de données :
var count = await db . ExecuteScalarAsync < int > ( " select count(*) from Stock " ) ;
Console . WriteLine ( string . Format ( " Found '{0}' stock items. " , count ) ) ;
sqlite-net est normalement utilisé comme ORM léger (object-relational-mapper) en utilisant les méthodes CreateTable
et Table
. Cependant, vous pouvez également l'utiliser comme moyen pratique d'exécuter manuellement des requêtes.
Voici un exemple de création d'une table, d'insertion dans celle-ci (avec une commande paramétrée) et d'interrogation sans utiliser les fonctionnalités ORM.
db . Execute ( " create table Stock(Symbol varchar(100) not null) " ) ;
db . Execute ( " insert into Stock(Symbol) values (?) " , " MSFT " ) ;
var stocks = db . Query < Stock > ( " select * from Stock " ) ;
Vous pouvez utiliser une base de données chiffrée à l’aide du package NuGet sqlite-net-sqlcipher.
La clé de base de données est définie dans le SqliteConnectionString
transmis au constructeur de connexion :
var options = new SQLiteConnectionString ( databasePath , true ,
key : " password " ) ;
var encryptedDb = new SQLiteAsyncConnection ( options ) ;
Si vous avez besoin de définir des pragmas pour contrôler le cryptage, les actions peuvent être transmises à la chaîne de connexion :
var options2 = new SQLiteConnectionString ( databasePath , true ,
key : " password " ,
preKeyAction : db => db . Execute ( " PRAGMA cipher_default_use_hmac = OFF; " ) ,
postKeyAction : db => db . Execute ( " PRAGMA kdf_iter = 128000; " ) ) ;
var encryptedDb2 = new SQLiteAsyncConnection ( options2 ) ;
Merci à la communauté .NET d'avoir adopté ce projet, et merci à tous les contributeurs qui ont contribué à rendre ce projet formidable.
Merci également à Tirza van Dijk (@tirzavdijk) pour le superbe logo !