Partager via


Utiliser une base de données SQLite dans une application UWP

Vous pouvez utiliser SQLite pour stocker et récupérer des données dans une base de données légère sur l’appareil de l’utilisateur. Ce guide vous montre comment procéder.

Certains avantages de l’utilisation de SQLite pour le stockage local

✔️ SQLite est léger et autonome. Il s’agit d’une bibliothèque de code sans aucune autre dépendance. Il n’y a rien à configurer.

✔️ Il n’existe aucun serveur de base de données. Le client et le serveur s’exécutent dans le même processus.

✔️ SQLite se trouve dans le domaine public afin de pouvoir l’utiliser et le distribuer librement avec votre application.

✔️ SQLite fonctionne sur plusieurs plateformes et architectures.

Vous pouvez en savoir plus sur SQLite ici.

Choisir une couche d’abstraction

Nous vous recommandons d’utiliser Entity Framework Core ou la bibliothèque SQLite open source générée par Microsoft.

Entity Framework Core

Entity Framework (EF) est un mappeur relationnel objet que vous pouvez utiliser pour travailler avec des données relationnelles à l’aide d’objets spécifiques au domaine. Si vous avez déjà utilisé cette infrastructure pour utiliser des données dans d’autres applications .NET, vous pouvez migrer ce code vers une application UWP et utiliser les modifications appropriées apportées à la chaîne de connexion.

Pour l’essayer, consultez Bien démarrer avec EF Core.

Bibliothèque SQLite

La bibliothèque Microsoft.Data.Sqlite implémente les interfaces dans l'espace de noms System.Data.Common. Microsoft gère activement ces implémentations et fournit un wrapper intuitif autour de l’API SQLite native de bas niveau.

Le reste de ce guide vous aide à utiliser cette bibliothèque.

Configurer votre solution pour utiliser la bibliothèque Microsoft.Data.SQlite

Nous allons commencer par un projet UWP de base, puis installer les packages Nuget appropriés.

Remarque

Veillez à installer le Microsoft.Data.Sqlite' package and not 'Microsoft.Data.Sqlite.Core. Ce package installe Microsoft.Data.Sqlite.Core en tant que dépendance.

Toutes les versions prises en charge de Windows prennent en charge SQLite. Par conséquent, votre application n’a pas besoin de empaqueter des bibliothèques SQLite. Au lieu de cela, votre application peut utiliser la version de SQLite qui est installée avec Windows. Cela vous aide de plusieurs façons.

✔️ Réduit la taille de votre application, car vous n’avez pas besoin de télécharger le fichier binaire SQLite, puis de le empaqueter dans le cadre de votre application.

✔️ Empêche d’avoir à envoyer (push) une nouvelle version de votre application aux utilisateurs si SQLite publie des correctifs critiques sur les bogues et les vulnérabilités de sécurité dans SQLite. La version Windows de SQLite est gérée par Microsoft en coordination avec SQLite.org.

✔️ Le temps de chargement de l’application peut être plus rapide, car la version du SDK de SQLite sera déjà chargée en mémoire.

Commençons par ajouter une classe à votre projet UWP nommé DataAccess. Vous pouvez utiliser un projet de bibliothèque de classes .NET Standard pour contenir votre code d’accès aux données, mais nous n’en utiliserons pas dans notre exemple.

Cliquez avec le bouton droit sur la solution, puis cliquez sur Gérer les packages NuGet pour la solution.

Une autre capture d’écran du panneau Explorateur de solutions avec le projet cliqué avec le bouton droit et l’option Gérer les packages NuGet mise en surbrillance.

À ce stade, vous avez le choix. Vous pouvez utiliser la version de SQLite incluse dans Windows ou si vous avez une raison d’utiliser une version spécifique de SQLite, vous pouvez inclure la bibliothèque SQLite dans votre package. Nous allons utiliser la version de SQLite incluse dans Windows.

Choisissez l'onglet Parcourir, recherchez le package Microsoft.Data.SQLite.Core, puis installez la dernière version stable.

Package SQLite Core

Ajouter et récupérer des données dans une base de données SQLite

Nous allons effectuer ces opérations :

1️⃣ Préparer la classe d’accès aux données.

2️⃣ Initialiser la base de données SQLite.

3️⃣ Insérer des données dans la base de données SQLite.

4️⃣ Récupérer des données de la base de données SQLite.

5️⃣ Ajouter une interface utilisateur de base.

Préparer la classe d’accès aux données

Ouvrez la classe DataAccess dans votre projet et rendez cette classe statique.

Remarque

Bien que notre exemple place le code d’accès aux données dans une classe statique, il s’agit simplement d’un choix de conception et est complètement facultatif.

public static class DataAccess
{

}

Ajoutez les instructions using suivantes en haut de ce fichier.

using Microsoft.Data.Sqlite;
using System.Collections.Generic;

Initialiser la base de données SQLite

Ajoutez une méthode à la classe DataAccess qui initialise la base de données SQLite.

public async static void InitializeDatabase()
{ 
     await ApplicationData.Current.LocalFolder.CreateFileAsync("sqliteSample.db", CreationCollisionOption.OpenIfExists);
     string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
     using (SqliteConnection db =
        new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();

        String tableCommand = "CREATE TABLE IF NOT " +
            "EXISTS MyTable (Primary_Key INTEGER PRIMARY KEY, " +
            "Text_Entry NVARCHAR(2048) NULL)";

        SqliteCommand createTable = new SqliteCommand(tableCommand, db);

        createTable.ExecuteReader();
    }
}

Ce code crée la base de données SQLite et la stocke dans le magasin de données local de l’application.

Dans cet exemple, nous nomlons la base de données sqlliteSample.db, mais vous pouvez utiliser le nom souhaité tant que vous utilisez ce nom dans tous les objets sqliteConnection que vous instanciez.

Dans le constructeur du fichier App.xaml.cs de votre projet UWP, appelez la méthode InitializeDatabase de la classe DataAccess.

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;

    DataAccess.InitializeDatabase();
}

Insérer des données dans la base de données SQLite

Ajoutez une méthode à la classe DataAccess qui insère des données dans la base de données SQLite. Ce code utilise des paramètres dans la requête pour empêcher les attaques par injection SQL.

public static void AddData(string inputText)
{
    string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
    using (SqliteConnection db =
      new SqliteConnection($"Filename={dbpath}"))
    {
        SQLitePCL.Batteries.Init();
        db.Open();

        SqliteCommand insertCommand = new SqliteCommand();
        insertCommand.Connection = db;

        // Use parameterized query to prevent SQL injection attacks
        insertCommand.CommandText = "INSERT INTO MyTable VALUES (NULL, @Entry);";
        insertCommand.Parameters.AddWithValue("@Entry", inputText);

        insertCommand.ExecuteReader();
    }

}

Récupérer des données de la base de données SQLite

Ajoutez une méthode qui obtient des lignes de données à partir d’une base de données SQLite.

public static List<String> GetData()
{
    List<String> entries = new List<string>();

   string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
   using (SqliteConnection db =
      new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();

        SqliteCommand selectCommand = new SqliteCommand
            ("SELECT Text_Entry from MyTable", db);

        SqliteDataReader query = selectCommand.ExecuteReader();

        while (query.Read())
        {
            entries.Add(query.GetString(0));
        }
    }

    return entries;
}

La méthode Read parcourt les lignes des données retournées. Cela retourne true s’il y a des lignes restantes, sinon cela retourne false.

La méthode GetString retourne la valeur de la colonne spécifiée sous forme de chaîne. Elle accepte une valeur entière qui représente l’ordinal de colonne de base zéro des données souhaitées. Vous pouvez utiliser des méthodes similaires telles que GetDataTime et GetBoolean. Choisissez une méthode en fonction du type de données que contient la colonne.

Le paramètre ordinal n’est pas aussi important dans cet exemple, car nous sélectionnons toutes les entrées dans une seule colonne. Toutefois, si plusieurs colonnes font partie de votre requête, utilisez la valeur ordinale pour obtenir la colonne à partir de laquelle vous souhaitez extraire des données.

Ajouter une interface utilisateur de base

Dans le fichier MainPage.xaml du projet UWP, ajoutez le code XAML suivant.

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel>
        <TextBox Name="Input_Box"></TextBox>
        <Button Click="AddData">Add</Button>
        <ListView Name="Output">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackPanel>
</Grid>

Cette interface utilisateur de base donne à l’utilisateur un TextBox qu’il peut utiliser pour taper une chaîne que nous ajouterons à la base de données SQLite. Nous allons connecter le Button dans cette interface utilisateur à un gestionnaire d’événements qui récupère les données de la base de données SQLite, puis affiche ces données dans le ListView.

Dans le fichier MainPage.xaml.cs, ajoutez le gestionnaire suivant. Il s’agit de la méthode que nous avons associée à l’événement Click de l'Button dans l’interface utilisateur.

private void AddData(object sender, RoutedEventArgs e)
{
    DataAccess.AddData(Input_Box.Text);

    Output.ItemsSource = DataAccess.GetData();
}

Nous voulons également nous assurer que toutes les données existantes sont chargées au démarrage de l’application. Ajoutez une ligne de code au constructeur MainPage pour appeler GetData().

public MainPage()
{
    this.InitializeComponent();

    Output.ItemsSource = DataAccess.GetData();
}

Voilà. Explorez les Microsoft.Data.Sqlite pour voir les autres choses que vous pouvez faire avec votre base de données SQLite. Consultez les liens ci-dessous pour en savoir plus sur les autres façons d’utiliser des données dans votre application UWP.

Étapes suivantes

Connecter votre application directement à une base de données SQL Server

Consultez Utiliser une base de données SQL Server dans une application UWP.

Partager du code entre différentes applications sur différentes plateformes

Consultez Partager du code entre une application de bureau et une application UWP.

Ajouter des pages maître/détail avec les back-ends Azure SQL

Consultez l'exemple de la base de données des commandes des clients .