Stocker des données dans une base de données SQLite.NET locale

Dans ce guide de démarrage rapide, vous allez apprendre à :

  • Stocker les données localement dans une base de données SQLite.NET.

Le guide de démarrage rapide explique comment stocker des données dans une base de données SQLite.NET locale, à partir d’une Xamarin.Forms application Shell. L’application finale est indiquée ci-dessous :

Page de notesPage d’entrée de note

Prérequis

Vous devez suivre correctement le précédent guide de démarrage rapide avant de tenter de suivre ce guide de démarrage rapide.

Mettre à jour l’application avec Visual Studio

  1. Lancez Visual Studio, puis ouvrez la solution Notes.

  2. Dans Explorateur de solutions, cliquez avec le bouton droit sur la solution Notes, puis sélectionnez Gérer les packages NuGet pour la solution... :

    Gérer les packages NuGet...

  3. Dans le Gestionnaire de package NuGet, sélectionnez l’onglet Parcourir et recherchez le package NuGet sqlite-net-pcl.

    Avertissement

    Il existe de nombreux packages NuGet avec des noms similaires. Le package correct possède ces attributs :

    Ne vous fiez pas au nom du package. Vous devez utiliser ce package NuGet dans les projets .NET Standard.

    Dans le Gestionnaire de package NuGet, sélectionnez le package sqlite-net-pcl correct, cochez la case Projet, puis cliquez sur le bouton Installer pour l’ajouter à la solution :

    Sélectionner sqlite-net-pcl

    Ce package sera utilisé pour incorporer des opérations de base de données dans l’application et sera ajouté à chaque projet de la solution.

    Important

    SQLite.NET est une bibliothèque tierce prise en charge à partir du référentiel praeclarum/sqlite-net.

    Fermez le Gestionnaire de package NuGet.

  4. Dans l’Explorateur de solutions, dans le projet Notes, ouvrez Note.cs dans le dossier Models, puis remplacez le code existant par le code suivant :

    using System;
    using SQLite;
    
    namespace Notes.Models
    {
        public class Note
        {
            [PrimaryKey, AutoIncrement]
            public int ID { get; set; }
            public string Text { get; set; }
            public DateTime Date { get; set; }
        }
    }
    

    Cette classe définit un modèle Note, qui stocke les données relatives à chaque note de l’application. La propriété ID est marquée avec les attributs PrimaryKey et AutoIncrement pour garantir que chaque instance de Note dans la base de données SQLite.NET a un ID unique fourni par SQLite.NET.

    Enregistrez les modifications apportées à Note.cs en appuyant sur Ctrl+S.

    Avertissement

    L’application ne sera pas générée actuellement en raison d’erreurs qui seront corrigées dans les étapes suivantes.

  5. Dans l’Explorateur de solutions, ajoutez un nouveau dossier nommé Data au projet Notes.

  6. Dans l’Explorateur de solutions, dans le projet Notes, ajoutez une nouvelle classe nommée NoteDatabase au dossier Data.

  7. Dans NoteDatabase.cs, remplacez le code existant par le code suivant :

    using System.Collections.Generic;
    using System.Threading.Tasks;
    using SQLite;
    using Notes.Models;
    
    namespace Notes.Data
    {
        public class NoteDatabase
        {
            readonly SQLiteAsyncConnection database;
    
            public NoteDatabase(string dbPath)
            {
                database = new SQLiteAsyncConnection(dbPath);
                database.CreateTableAsync<Note>().Wait();
            }
    
            public Task<List<Note>> GetNotesAsync()
            {
                //Get all notes.
                return database.Table<Note>().ToListAsync();
            }
    
            public Task<Note> GetNoteAsync(int id)
            {
                // Get a specific note.
                return database.Table<Note>()
                                .Where(i => i.ID == id)
                                .FirstOrDefaultAsync();
            }
    
            public Task<int> SaveNoteAsync(Note note)
            {
                if (note.ID != 0)
                {
                    // Update an existing note.
                    return database.UpdateAsync(note);
                }
                else
                {
                    // Save a new note.
                    return database.InsertAsync(note);
                }
            }
    
            public Task<int> DeleteNoteAsync(Note note)
            {
                // Delete a note.
                return database.DeleteAsync(note);
            }
        }
    }
    

    Cette classe contient du code qui permet de créer la base de données, de lire les données existantes, d’en écrire de nouvelles ou d’en supprimer. Le code utilise des API SQLite.NET asynchrones qui déplacent les opérations de base de données vers les threads d’arrière-plan. De plus, le constructeur NoteDatabase prend le chemin du fichier de base de données en tant qu’argument. Ce chemin est fourni par la classe App à l’étape suivante.

    Enregistrez les modifications apportées à NoteDatabase.cs en appuyant sur Ctrl+S.

    Avertissement

    L’application ne sera pas générée actuellement en raison d’erreurs qui seront corrigées dans les étapes suivantes.

  8. Dans Explorateur de solutions, dans le projet Notes, développez App.xaml et double-cliquez sur App.xaml.cs pour l’ouvrir. Remplacez ensuite le code existant par le code suivant :

    using System;
    using System.IO;
    using Notes.Data;
    using Xamarin.Forms;
    
    namespace Notes
    {
        public partial class App : Application
        {
            static NoteDatabase database;
    
            // Create the database connection as a singleton.
            public static NoteDatabase Database
            {
                get
                {
                    if (database == null)
                    {
                        database = new NoteDatabase(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Notes.db3"));
                    }
                    return database;
                }
            }
    
            public App()
            {
                InitializeComponent();
                MainPage = new AppShell();
            }
    
            protected override void OnStart()
            {
            }
    
            protected override void OnSleep()
            {
            }
    
            protected override void OnResume()
            {
            }
        }
    }
    

    Ce code définit une propriété Database, qui crée une instance de NoteDatabase en tant que singleton et passe le nom de fichier de la base de données en tant qu’argument au constructeur NoteDatabase. Lorsque vous exposez la base de données comme un singleton, une connexion de base de données unique est créée et reste ouverte lors de l’exécution de l’application. Ainsi, vous évitez les dépenses liées à l’ouverture et à la fermeture du fichier de base de données chaque fois qu’une opération de base de données est effectuée.

    Enregistrez les modifications dans App.xaml.cs en appuyant sur Ctrl+S.

    Avertissement

    L’application ne sera pas générée actuellement en raison d’erreurs qui seront corrigées dans les étapes suivantes.

  9. Dans Explorateur de solutions, dans le projet Notes, développez NotesPage.xaml dans le dossier Views et ouvrez NotesPage.xaml.cs. Remplacez ensuite les méthodes OnAppearing et OnSelectionChanged par le code suivant :

    protected override async void OnAppearing()
    {
        base.OnAppearing();
    
        // Retrieve all the notes from the database, and set them as the
        // data source for the CollectionView.
        collectionView.ItemsSource = await App.Database.GetNotesAsync();
    }
    
    async void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.CurrentSelection != null)
        {
            // Navigate to the NoteEntryPage, passing the ID as a query parameter.
            Note note = (Note)e.CurrentSelection.FirstOrDefault();
            await Shell.Current.GoToAsync($"{nameof(NoteEntryPage)}?{nameof(NoteEntryPage.ItemId)}={note.ID.ToString()}");
        }
    }    
    

    La OnAppearing méthode remplit les CollectionView notes stockées dans la base de données. La OnSelectionChanged méthode accède à la NoteEntryPageID propriété de l’objet sélectionné Note en tant que paramètre de requête.

    Enregistrez les modifications apportées à NotesPage.xaml.cs en appuyant sur Ctrl+S.

    Avertissement

    L’application ne sera pas générée actuellement en raison d’erreurs qui seront corrigées dans les étapes suivantes.

  10. Dans Explorateur de solutions, développez NoteEntryPage.xaml dans le dossier Views et ouvrez NoteEntryPage.xaml.cs. Remplacez ensuite les LoadNoteméthodes , OnSaveButtonClickedet OnDeleteButtonClicked remplacez les méthodes par le code suivant :

    async void LoadNote(string itemId)
    {
        try
        {
            int id = Convert.ToInt32(itemId);
            // Retrieve the note and set it as the BindingContext of the page.
            Note note = await App.Database.GetNoteAsync(id);
            BindingContext = note;
        }
        catch (Exception)
        {
            Console.WriteLine("Failed to load note.");
        }
    }
    
    async void OnSaveButtonClicked(object sender, EventArgs e)
    {
        var note = (Note)BindingContext;
        note.Date = DateTime.UtcNow;
        if (!string.IsNullOrWhiteSpace(note.Text))
        {
            await App.Database.SaveNoteAsync(note);
        }
    
        // Navigate backwards
        await Shell.Current.GoToAsync("..");
    }
    
    async void OnDeleteButtonClicked(object sender, EventArgs e)
    {
        var note = (Note)BindingContext;
        await App.Database.DeleteNoteAsync(note);
    
        // Navigate backwards
        await Shell.Current.GoToAsync("..");
    }
    

    La NoteEntryPage méthode utilise la LoadNote méthode pour récupérer la note à partir de la base de données, dont l’ID a été transmis en tant que paramètre de requête à la page et le stocker en tant qu’objet Note dans la BindingContext page. Quand le gestionnaire d’événements OnSaveButtonClicked s’exécute, l’instance de Note est enregistrée dans la base de données, et l’application revient à la page précédente. Quand le gestionnaire d’événements OnDeleteButtonClicked s’exécute, l’instance de Note est supprimée de la base de données, et l’application revient à la page précédente.

    Enregistrez les modifications dans NoteEntryPage.xaml.cs en appuyant sur Ctrl+S.

  11. Générez et exécutez le projet sur chaque plateforme. Pour plus d’informations, consultez Génération du guide de démarrage rapide.

    Dans La page Notes, appuyez sur le bouton Ajouter pour accéder à NoteEntryPage et entrer une note. Une fois que vous avez enregistré la note, l’application revient à NotesPage.

    Entrez plusieurs notes, de longueur variable, pour observer le comportement de l’application. Fermez l’application et relancez-la pour vous assurer que les notes que vous avez entrées ont été enregistrées dans la base de données.

Mettre à jour l’application avec Visual Studio pour Mac

  1. Lancez Visual Studio pour Mac et ouvrez la solution Notes.

  2. Dans le panneau Solution, cliquez avec le bouton droit sur la solution Notes, puis sélectionnez Gérer les packages NuGet... :

    Gérer les packages NuGet...

  3. Dans la boîte de dialogue Gérer les packages NuGet, sélectionnez l’onglet Parcourir et recherchez le package NuGet sqlite-net-pcl .

    Avertissement

    Il existe de nombreux packages NuGet avec des noms similaires. Le package correct possède ces attributs :

    Ne vous fiez pas au nom du package. Vous devez utiliser ce package NuGet dans les projets .NET Standard.

    Dans la boîte de dialogue Gérer les packages NuGet, sélectionnez le package sqlite-net-pcl , puis cliquez sur le bouton Ajouter un package pour l’ajouter à la solution :

    Sélectionner sqlite-net-pcl

    Ce package sera utilisé pour incorporer les opérations de base de données dans l’application.

  4. Dans la boîte de dialogue Sélectionner des projets , vérifiez que chaque case à cocher est cochée et appuyez sur le bouton Ok :

    Ajouter un package à tous les projets

    Cela ajoute le package NuGet à chaque projet de la solution.

  5. Dans le Panneau Solutions, dans le projet Notes, ouvrez Note.cs dans le dossier Models, puis remplacez le code existant par le code suivant :

    using System;
    using SQLite;
    
    namespace Notes.Models
    {
        public class Note
        {
            [PrimaryKey, AutoIncrement]
            public int ID { get; set; }
            public string Text { get; set; }
            public DateTime Date { get; set; }
        }
    }
    

    Cette classe définit un modèle Note, qui stocke les données relatives à chaque note de l’application. La propriété ID est marquée avec les attributs PrimaryKey et AutoIncrement pour garantir que chaque instance de Note dans la base de données SQLite.NET a un ID unique fourni par SQLite.NET.

    Enregistrez les modifications apportées à Note.cs en choisissant Fichier > Enregistrer (ou en appuyant sur ⌘ + S).

    Avertissement

    L’application ne sera pas générée actuellement en raison d’erreurs qui seront corrigées dans les étapes suivantes.

  6. Dans le Panneau Solutions, ajoutez un nouveau dossier nommé Data au projet Notes.

  7. Dans le Panneau Solutions, dans le projet Notes, ajoutez une nouvelle classe nommée NoteDatabase au dossier Data.

  8. Dans NoteDatabase.cs, remplacez le code existant par le code suivant :

    using System.Collections.Generic;
    using System.Threading.Tasks;
    using SQLite;
    using Notes.Models;
    
    namespace Notes.Data
    {
        public class NoteDatabase
        {
            readonly SQLiteAsyncConnection database;
    
            public NoteDatabase(string dbPath)
            {
                database = new SQLiteAsyncConnection(dbPath);
                database.CreateTableAsync<Note>().Wait();
            }
    
            public Task<List<Note>> GetNotesAsync()
            {
                //Get all notes.
                return database.Table<Note>().ToListAsync();
            }
    
            public Task<Note> GetNoteAsync(int id)
            {
                // Get a specific note.
                return database.Table<Note>()
                                .Where(i => i.ID == id)
                                .FirstOrDefaultAsync();
            }
    
            public Task<int> SaveNoteAsync(Note note)
            {
                if (note.ID != 0)
                {
                    // Update an existing note.
                    return database.UpdateAsync(note);
                }
                else
                {
                    // Save a new note.
                    return database.InsertAsync(note);
                }
            }
    
            public Task<int> DeleteNoteAsync(Note note)
            {
                // Delete a note.
                return database.DeleteAsync(note);
            }
        }
    }
    

    Cette classe contient du code qui permet de créer la base de données, de lire les données existantes, d’en écrire de nouvelles ou d’en supprimer. Le code utilise des API SQLite.NET asynchrones qui déplacent les opérations de base de données vers les threads d’arrière-plan. De plus, le constructeur NoteDatabase prend le chemin du fichier de base de données en tant qu’argument. Ce chemin est fourni par la classe App à l’étape suivante.

    Enregistrez les modifications apportées à NoteDatabase.cs en choisissant Fichier > Enregistrer (ou en appuyant sur ⌘ + S).

    Avertissement

    L’application ne sera pas générée actuellement en raison d’erreurs qui seront corrigées dans les étapes suivantes.

  9. Dans le panneau Solution, dans le projet Notes , développez App.xaml et double-cliquez sur App.xaml.cs pour l’ouvrir. Remplacez ensuite le code existant par le code suivant :

    using System;
    using System.IO;
    using Notes.Data;
    using Xamarin.Forms;
    
    namespace Notes
    {
        public partial class App : Application
        {
            static NoteDatabase database;
    
            // Create the database connection as a singleton.
            public static NoteDatabase Database
            {
                get
                {
                    if (database == null)
                    {
                        database = new NoteDatabase(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Notes.db3"));
                    }
                    return database;
                }
            }
    
            public App()
            {
                InitializeComponent();
                MainPage = new AppShell();
            }
    
            protected override void OnStart()
            {
            }
    
            protected override void OnSleep()
            {
            }
    
            protected override void OnResume()
            {
            }
        }
    }
    

    Ce code définit une propriété Database, qui crée une instance de NoteDatabase en tant que singleton et passe le nom de fichier de la base de données en tant qu’argument au constructeur NoteDatabase. Lorsque vous exposez la base de données comme un singleton, une connexion de base de données unique est créée et reste ouverte lors de l’exécution de l’application. Ainsi, vous évitez les dépenses liées à l’ouverture et à la fermeture du fichier de base de données chaque fois qu’une opération de base de données est effectuée.

    Enregistrez les modifications apportées à App.xaml.cs en choisissant Fichier > Enregistrer (ou en appuyant sur ⌘ + S).

    Avertissement

    L’application ne sera pas générée actuellement en raison d’erreurs qui seront corrigées dans les étapes suivantes.

  10. Dans le panneau Solution, dans le projet Notes , développez NotesPage.xaml dans le dossier Views et ouvrez NotesPage.xaml.cs. Remplacez ensuite les méthodes OnAppearing et OnSelectionChanged par le code suivant :

    protected override async void OnAppearing()
    {
        base.OnAppearing();
    
        // Retrieve all the notes from the database, and set them as the
        // data source for the CollectionView.
        collectionView.ItemsSource = await App.Database.GetNotesAsync();
    }
    
    async void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.CurrentSelection != null)
        {
            // Navigate to the NoteEntryPage, passing the ID as a query parameter.
            Note note = (Note)e.CurrentSelection.FirstOrDefault();
            await Shell.Current.GoToAsync($"{nameof(NoteEntryPage)}?{nameof(NoteEntryPage.ItemId)}={note.ID.ToString()}");
        }
    }    
    

    La OnAppearing méthode remplit les CollectionView notes stockées dans la base de données. La OnSelectionChanged méthode accède à la NoteEntryPageID propriété de l’objet sélectionné Note en tant que paramètre de requête.

    Enregistrez les modifications apportées à NotesPage.xaml.cs en choisissant Fichier > Enregistrer (ou en appuyant sur ⌘ + S).

    Avertissement

    L’application ne sera pas générée actuellement en raison d’erreurs qui seront corrigées dans les étapes suivantes.

  11. Dans le panneau Solution, développez NoteEntryPage.xaml dans le dossier Views et ouvrez NoteEntryPage.xaml.cs. Remplacez ensuite les LoadNoteméthodes , OnSaveButtonClickedet OnDeleteButtonClicked remplacez les méthodes par le code suivant :

    async void LoadNote(string itemId)
    {
        try
        {
            int id = Convert.ToInt32(itemId);
            // Retrieve the note and set it as the BindingContext of the page.
            Note note = await App.Database.GetNoteAsync(id);
            BindingContext = note;
        }
        catch (Exception)
        {
            Console.WriteLine("Failed to load note.");
        }
    }
    
    async void OnSaveButtonClicked(object sender, EventArgs e)
    {
        var note = (Note)BindingContext;
        note.Date = DateTime.UtcNow;
        if (!string.IsNullOrWhiteSpace(note.Text))
        {
            await App.Database.SaveNoteAsync(note);
        }
    
        // Navigate backwards
        await Shell.Current.GoToAsync("..");
    }
    
    async void OnDeleteButtonClicked(object sender, EventArgs e)
    {
        var note = (Note)BindingContext;
        await App.Database.DeleteNoteAsync(note);
    
        // Navigate backwards
        await Shell.Current.GoToAsync("..");
    }
    

    La NoteEntryPage méthode utilise la LoadNote méthode pour récupérer la note à partir de la base de données, dont l’ID a été transmis en tant que paramètre de requête à la page et le stocker en tant qu’objet Note dans la BindingContext page. Quand le gestionnaire d’événements OnSaveButtonClicked s’exécute, l’instance de Note est enregistrée dans la base de données, et l’application revient à la page précédente. Quand le gestionnaire d’événements OnDeleteButtonClicked s’exécute, l’instance de Note est supprimée de la base de données, et l’application revient à la page précédente.

    Enregistrez les modifications apportées à NoteEntryPage.xaml.cs en choisissant Fichier > Enregistrer (ou en appuyant sur ⌘ + S).

  12. Générez et exécutez le projet sur chaque plateforme. Pour plus d’informations, consultez Génération du guide de démarrage rapide.

    Dans La page Notes, appuyez sur le bouton Ajouter pour accéder à NoteEntryPage et entrer une note. Une fois que vous avez enregistré la note, l’application revient à NotesPage.

    Entrez plusieurs notes, de longueur variable, pour observer le comportement de l’application. Fermez l’application et relancez-la pour vous assurer que les notes que vous avez entrées ont été enregistrées dans la base de données.

Étapes suivantes

Dans ce démarrage rapide, vous avez appris comment :

  • Stocker les données localement dans une base de données SQLite.NET.

Passez au guide de démarrage rapide suivant pour mettre en forme l’application avec des styles XAML.