Oefening: Gegevens lokaal opslaan met SQLite

Voltooid

In deze oefening gebruikt u SQLite om gegevens lokaal op te slaan met een toepassing. In het voorbeeldscenario hebt u besloten om gegevens voor de sociale media-app in de cache op te cachen om de reactiesnelheid te verbeteren. In deze oefening maakt en gebruikt u een lokale SQLite-database voor het opslaan van informatie over personen. U slaat het fysieke databasebestand op in de lokale opslag.

In deze module wordt de .NET 9.0 SDK gebruikt. Zorg ervoor dat .NET 9.0 is geïnstalleerd door de volgende opdracht uit te voeren in de opdrachtterminal van uw voorkeur:

dotnet --list-sdks

Uitvoer die vergelijkbaar is met het volgende voorbeeld wordt weergegeven:

8.0.100 [C:\Program Files\dotnet\sdk]
9.0.100 [C:\Program Files\dotnet\sdk]

Zorg ervoor dat er een versie wordt vermeld die begint met 9 . Als er geen wordt vermeld of de opdracht niet wordt gevonden, installeert u de meest recente .NET 9.0 SDK.

Open de startersoplossing

  1. Kloon of download de oefeningsopslagplaats.

    Notitie

    Het is raadzaam om de inhoud van de oefening te klonen naar een kort mappad, zoals C:\dev, om te voorkomen dat door build gegenereerde bestanden de maximale padlengte overschrijden.

  2. Gebruik Visual Studio om de People.sln-oplossing te openen, die u vindt in mslearn-dotnetmaui-store-local-data> of de startersmap in Visual Studio Code.

    Notitie

    Probeer de toepassing nog niet uit te voeren. De code is onvolledig en genereert uitzonderingen totdat u de ontbrekende elementen verderop in deze oefening toevoegt.

Een SQLite-entiteit definiëren

  1. Open het bestand Person.cs in de map Modellen .

  2. Voeg een int eigenschap toe die aangeroepen is Id aan de Person klasse.

  3. Voeg een string eigenschap toe met de naam Name. De klasse moet er als volgt uitzien:

    namespace People.Models;
    
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    
  4. Sla het Person.cs bestand op.

De SQLite-bibliotheek toevoegen

  1. Klik met de rechtermuisknop op het projectknooppunt Personen vanuit Solution Explorer in Visual Studio.

  2. Selecteer NuGet-pakketten beheren in het contextmenu dat wordt weergegeven.

  3. Zoek en selecteer sqlite-net-pcl en selecteer vervolgens Installeren.

    Een schermopname van NuGet-pakketbeheer met de sqlite-net-pcl-bibliotheek geselecteerd.

Als u Visual Studio Code gebruikt, opent u de terminal en deze pakketten met de volgende opdrachten:

dotnet add package sqlite-net-pcl

SQLite-kenmerken toevoegen

  1. Voeg in het bestand Person.cs een using instructie voor de SQLite naamruimte toe aan het bestand voor de Person klasse. Met deze instructie kunt u de SQLite-kenmerken gebruiken.

    using SQLite;
    
    namespace People.Models;
    
    public class Person
    {
        ...
    }
    
  2. Aantekeningen toevoegen aan de Person klasse met het [Table] kenmerk en de tabelnaam opgeven als people.

  3. Geef de Id eigenschap op als de primaire sleutel. Aantekeningen maken met de [PrimaryKey] en [AutoIncrement] kenmerken.

  4. Aantekeningen toevoegen aan de Name eigenschap. Geef de waarde MaxLength op als 250. Geef op dat elke waarde in de kolom moet zijn Unique.

    De voltooide klasse moet er als volgt uitzien:

    using SQLite;
    
    namespace People.Models;
    
    [Table("people")]
    public class Person
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
    
        [MaxLength(250), Unique]
        public string Name { get; set; }
    }
    
  5. Sla het Person.cs bestand op.

Verbinding maken met de database

  1. Open het PersonRepository.cs bestand.

  2. Bekijk de PersonRepository klas. Deze klasse bevat onvolledige basiscode met TODO markeringen waar u de functionaliteit toevoegt voor toegang tot de database.

  3. Voeg een using instructie toe voor de SQLite en People.Models naamruimten aan het bestand voor de PersonRepository.cs klasse.

  4. Voeg een privéveld SQLiteConnection toe aan conn de klasse, boven de Init functie.

  5. Controleer in de Init functie of conn deze niet gelijk is aan null. Zo ja, dan keert u onmiddellijk terug.

    if (conn != null)
        return;
    

    Op deze manier wordt de initialisatiecode voor de SQLite-database slechts eenmaal uitgevoerd.

  6. Initialiseer het conn veld om verbinding te maken met de database met behulp van de _dbPath variabele.

  7. Gebruik de conn.CreateTable methode om een tabel te maken om gegevens op te slaan Person . De voltooide Init functie moet er als volgt uitzien:

    using SQLite;
    using People.Models;
    ...
    
    private SQLiteConnection conn;
    ...
    private void Init()
    {
       if (conn != null)
          return;
    
       conn = new SQLiteConnection(_dbPath);
       conn.CreateTable<Person>();
    }
    

Een rij invoegen in de database

  1. Zoek PersonRepository in de klasse de AddNewPerson methode.

  2. Als u een nieuw Person object wilt invoegen, vervangt u de TODO opmerking in deze methode door code. De code roept Init eerst aan om te controleren of de database is geïnitialiseerd en gebruikt vervolgens de methode van SQLiteConnection het Insert object. Stel de result variabele in op de waarde die door de Insert methode wordt geretourneerd, zoals wordt weergegeven in de volgende code:

    public void AddNewPerson(string name)
    {
        int result = 0;
        try
        {
            // enter this line
            Init();
    
            // basic validation to ensure a name was entered
            if (string.IsNullOrEmpty(name))
                throw new Exception("Valid name required");
    
            // enter this line
            result = conn.Insert(new Person { Name = name });
            ...
        }
        ...
    }
    

Rijen ophalen uit de database

  1. Zoek de PersonRepository methode in de GetAllPeople klasse.

  2. Aanroep Init om te controleren of de database is geïnitialiseerd.

  3. Gebruik de algemene Table\<T> methode om alle rijen in de tabel op te halen. Geef Person op als de typeparameter.

  4. Gebruik de ToList() extensiemethode om het resultaat om te zetten in een List\<Person> verzameling en deze verzameling te retourneren.

  5. Voeg foutafhandeling toe door uw code in een try-catch blok te verpakken. Als er een fout optreedt, stelt u de StatusMessage eigenschap in op de eigenschap van Message de uitzondering en retourneert u een lege verzameling. De voltooide methode moet er als volgt uitzien:

    public List<Person> GetAllPeople()
    {
       try
       {
          Init();
          return conn.Table<Person>().ToList();
       }
       catch (Exception ex)
       {
          StatusMessage = string.Format("Failed to retrieve data. {0}", ex.Message);
       }
    
       return new List<Person>();
    }
    
  6. Sla het PersonRepository.cs bestand op.

De opslagplaats integreren in de gebruikersinterface

  1. Open het bestand MauiProgram.cs .

  2. Voeg in de CreateMauiApp functie, na de instructies die de MainPage pagina als een singleton-service aan de app toevoegen, code toe om de volgende taken uit te voeren:

    • Maak een tekenreeksvariabele met de naam dbPath. Initialiseer deze tekenreeks met de expressie FileAccessHelper.GetLocalFilePath("people.db3"). Het databasebestand dat door de app wordt gebruikt, heet people.db3 en de app slaat dit bestand op in de lokale opslag op het apparaat.

    • Gebruik afhankelijkheidsinjectie om de PersonRepository klasse als een singleton-service toe te voegen aan de app. De PersonRepository klasse maakt een constructor beschikbaar die het pad naar het databasebestand als een tekenreeksparameter gebruikt.

    De voltooide code voor de CreateMauiApp functie moet er als volgt uitzien:

    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });
    
        // Add this code
        string dbPath = FileAccessHelper.GetLocalFilePath("people.db3");
        builder.Services.AddSingleton<PersonRepository>(s => ActivatorUtilities.CreateInstance<PersonRepository>(s, dbPath));
    
        return builder.Build();
    }
    
  3. Sla het MauiProgram.cs bestand op.

  4. Vouw App.xaml uit in Solution Explorer en open het bestand App.xaml.cs .

  5. Voeg een publiceigenschap toe static met de naam PersonRepo. Deze eigenschap bevat een PersonRepository object voor de App klasse.

  6. Initialiseer de PersonRepo eigenschap in de constructor door een PersonRepository parameter toe te voegen aan de constructor en de eigenschap PersonRepo in te stellen op de waarde in deze parameter. De voltooide App klasse moet er als volgt uitzien:

    public partial class App : Application
    {
        public static PersonRepository PersonRepo { get; private set; }
    
        public App(PersonRepository repo)
        {
            InitializeComponent();
            PersonRepo = repo;
        }
    }
    

Notitie

Het afhankelijkheidsinjectieproces vult de repo parameter automatisch in voor de constructor.

De toepassing testen

  1. Bouw de oplossing met Ctrl+Shift+B.

  2. Zodra de build is voltooid, begint u met het opsporen van fouten met F5. Wanneer de gebruikersinterface wordt weergegeven, voert u uw naam in en selecteert u Persoon toevoegen.

    Een schermopname van de app met een bericht waarin wordt aangegeven dat er een record wordt toegevoegd.

  3. Selecteer Alle personen ophalen en controleer of uw naam wordt weergegeven.

    Een schermopname van de app met een lijst met alle records in de database.

  4. Experimenteer door meer namen toe te voegen en de lijst met opgeslagen personen op te halen.

  5. Ga terug naar Visual Studio of Visual Studio Code en stop de foutopsporing met behulp van Shift+F5.

  6. Start de app opnieuw op en selecteer Alle personen ophalen. Controleer of de namen die u eerder hebt opgeslagen, nog steeds zijn opgeslagen in de database. Sluit de app wanneer u klaar bent.