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 explique comment procéder.

Avantages liés à l’utilisation de SQLite pour le stockage local

✔️ SQLite est non activable et autonome. Il s’agit d’une bibliothèque de codes indépendante. Tout est déjà configuré.

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

✔️ SQLite étant dans le domaine public, son utilisation et sa distribution avec votre application sont libres.

✔️ SQLite fonctionne sur différentes plateformes et architectures.

Vous trouverez davantage d’informations 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 qui vous permet de travailler avec des données relationnelles en utilisant des objets propres au domaine. Si vous avez déjà utilisé cette infrastructure pour travailler avec des données dans d’autres applications .NET, vous pouvez migrer ce code vers une application UWP. Il fonctionnera avec les changements appropriés apportés à 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, qui fournissent 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.

Toutes les versions prises en charge de Windows prennent en charge SQLite. Votre application n’a donc pas besoin d’empaqueter des bibliothèques SQLite. Au lieu de cela, elle peut utiliser la version de SQLite qui est installée avec Windows. Cette solution est particulièrement intéressante.

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

✔️ Vous évite d’avoir à envoyer (par push) une nouvelle version de votre application aux utilisateurs dans le cas où SQLite publie des correctifs critiques pour les bogues et failles 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 des applications est potentiellement plus rapide, car le plus souvent, la version du SDK de SQLite est 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.

Another screenshot of the Solution Explorer panel with the project right-clicked and the Manage NuGet Packages option highlighted.

À ce stade, vous avez plusieurs possibilités. Vous pouvez utiliser la version de SQLite fournie avec Windows. Si vous avez besoin 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.

SQLite Core package

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

Nous allons effectuer les opérations suivantes :

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 dans 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, puis rendez cette classe statique.

Notes

Notre exemple va placer le code d’accès aux données dans une classe statique. Il ne s’agit là que d’un choix de conception parfaitement 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 à la classe DataAccess une méthode 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 appelons la base de données sqlliteSample.db, mais vous pouvez choisir le nom que vous souhaitez tant que vous l’utilisez 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 à la classe DataAccess une méthode qui insère des données dans la base de données SQLite. Ce code utilise les paramètres de la requête afin d’empêcher les attaques par injection de code SQL.

public static void AddData(string inputText)
{
    string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
    using (SqliteConnection db =
      new SqliteConnection($"Filename={dbpath}"))
    {
        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 dans la base de données SQLite

Ajoutez une méthode qui obtient des lignes de données 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 avance dans les lignes de données retournées. Elle retourne true s’il reste des lignes ; sinon, elle 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 que vous voulez. Vous pouvez utiliser des méthodes similaires comme GetDataTime et GetBoolean. Choisissez une méthode basée sur le type de données contenues dans la colonne.

Le paramètre ordinal n’est pas aussi important dans cet exemple, car nous allons sélectionner toutes les entrées d’une même colonne. Toutefois, si plusieurs colonnes font partie de votre requête, utilisez la valeur ordinale pour obtenir la colonne 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 fournit à l’utilisateur un TextBox qu’il peut utiliser pour entrer une chaîne que nous ajouterons à la base de données SQLite. Nous allons connecter le Button de cette interface utilisateur à un gestionnaire d’événements qui va récupérer des données dans la base de données SQLite, puis les afficher 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 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();
}

C’est terminé. Explorez Microsoft.Data.Sqlite pour découvrir ce que vous pouvez faire d’autre 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 Exemple de base de données de commandes des clients.