Cvičení: Místní ukládání dat pomocí SQLite

Dokončeno

V tomto cvičení použijete SQLite k místnímu ukládání informací s aplikací. V ukázkovém scénáři jste se rozhodli ukládat data do mezipaměti pro aplikaci sociálních médií, abyste zlepšili rychlost odezvy. Toto cvičení vytvoří a použije místní databázi SQLite k ukládání informací o lidech. Soubor fyzické databáze uložíte v místním úložišti.

Tento modul používá sadu .NET 8.0 SDK. Spuštěním následujícího příkazu v upřednostňovaném příkazovém terminálu se ujistěte, že máte nainstalované rozhraní .NET 8.0:

dotnet --list-sdks

Zobrazí se výstup podobný následujícímu příkladu:

6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]

Ujistěte se, že je uvedená verze, na 8 které začíná. Pokud žádný není uvedený nebo příkaz nebyl nalezen, nainstalujte nejnovější sadu .NET 8.0 SDK.

Otevření úvodního řešení

  1. Naklonujte nebo stáhněte úložiště cvičení.

    Poznámka:

    Nejlepší je naklonovat obsah cvičení do krátké cesty ke složce, jako je C:\dev, aby se zabránilo překročení maximální délky cesty vygenerovaných sestavením.

  2. V sadě Visual Studio otevřete řešení People.sln, které najdete v mslearn-dotnetmaui-store-local-data>People, nebo v úvodní složce v editoru Visual Studio Code.

    Poznámka:

    Zatím řešení nepokoušejte a sestavte. Kód je neúplný a nebude kompilován, dokud později v tomto cvičení nepřidáte chybějící prvky.

Definování entity SQLite

  1. Klikněte pravým tlačítkem myši na projekt Lidé , vyberte Přidat a pak vyberte Nová složka a přidejte do projektu novou složku. Pojmenujte novou složku Models.

  2. Klikněte pravým tlačítkem na složku Modely , vyberte Přidat a vyberte Třída. Ujistěte se, že je v seznamu vybraná třída , a pak pojmenujte novou třídu Person.cs. Vyberte Přidat.

  3. Upravte třídu a označte ji jako public:

    namespace People.Models
    {
    
        public class Person
        {
        }
    }
    
  4. Přidejte do třídy volanou int Id Person vlastnost.

  5. string Přidejte vlastnost s názvem Name. Třída by měla vypadat takto:

    namespace People.Models
    {
    
        public class Person
        {
        public int Id { get; set; }
        public string Name { get; set; }
        }
    }
    
  6. Uložte soubor Person.cs.

Přidání knihovny SQLite

  1. Klikněte pravým tlačítkem myši na uzel projektu Lidé z Průzkumník řešení v sadě Visual Studio.

  2. V místní nabídce, která se zobrazí, vyberte Spravovat balíčky NuGet.

  3. Vyhledejte a vyberte sqlite-net-pcl a pak vyberte Nainstalovat.

    Snímek obrazovky zobrazující správce balíčků NuGet s vybranou knihovnou sqlite-net-pcl

  4. Vyhledejte a vyberte SQLitePCLRaw.bundle_green a pak vyberte Nainstalovat.

Pokud používáte Visual Studio Code, otevřete terminál a tyto balíčky pomocí následujících příkazů:

dotnet add package sqlite-net-pcl
dotnet add package SQLitePCLRaw.bundle_green

Přidání atributů SQLite

  1. Do souboru Person.cs přidejte direktivu using SQLite oboru názvů do souboru třídyPerson. Tato direktiva umožňuje používat atributy SQLite.

    using SQLite;
    
    namespace People.Models
    {
    
        public class Person
        ...
    }
    
  2. Označte Person třídu atributem [Table] a zadejte název tabulky jako people.

  3. Id Zadejte vlastnost jako primární klíč. Označte ji poznámkami [PrimaryKey] a [AutoIncrement] atributy.

  4. Přidejte do Name vlastnosti poznámky. Zadejte jeho MaxLength hodnotu 250. Určete, že každá hodnota ve sloupci by měla být Unique.

    Dokončená třída by měla vypadat takto:

    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. Uložte soubor Person.cs.

Připojte se k databázi.

  1. Otevřete soubor PersonRepository.cs.

  2. PersonRepository Prozkoumejte třídu. Tato třída obsahuje neúplný kostru kódu se TODO značkami, do kterých přidáte funkce pro přístup k databázi.

  3. Přidejte direktivu using pro obory SQLite názvů a People.Models obory názvů do souboru pro PersonRepository.cs třídu.

  4. Nad funkci přidejte soukromé SQLiteConnection pole pojmenované conn do třídy Init .

  5. Init Ve funkci zkontrolujte, jestli conn není rovno null. Pokud ano, vraťte se okamžitě.

    if (conn != null)
        return;
    

    Tímto způsobem se inicializační kód pro databázi SQLite spustí jenom jednou.

  6. Inicializuje conn pole pro připojení k databázi pomocí _dbPath proměnné.

  7. conn.CreateTable Pomocí této metody vytvořte tabulku pro ukládání Person dat. Dokončená Init funkce by měla vypadat takto:

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

Vložení řádku do databáze

  1. Ve PersonRepository třídě vyhledejte metodu AddNewPerson .

  2. Chcete-li vložit nový Person objekt, nahraďte TODO komentář v této metodě kódem. Kód nejprve zavolá Init k ověření inicializace databáze a pak použije metodu objektu SQLiteConnection Insert . Nastavte proměnnou result na hodnotu, kterou Insert metoda vrátí, jak je znázorněno v následujícím kódu:

    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 });
            ...
        }
        ...
    }
    

Načtení řádků z databáze

  1. PersonRepository Ve třídě vyhledejte metoduGetAllPeople.

  2. Voláním Init ověřte, že je databáze inicializována.

  3. Pomocí obecné Table\<T> metody načtěte všechny řádky v tabulce. Zadejte Person jako parametr typu.

  4. ToList() Pomocí metody rozšíření můžete výsledek převést na List\<Person> kolekci a vrátit tuto kolekci.

  5. Přidejte zpracování chyb zabalením kódu do try-catch bloku. Pokud dojde k chybě, nastavte StatusMessage vlastnost na vlastnost výjimky Message a vraťte prázdnou kolekci. Dokončená metoda by měla vypadat takto:

    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. Uložte soubor PersonRepository.cs.

Integrace úložiště do uživatelského rozhraní

  1. Otevřete soubor MauiProgram.cs.

  2. CreateMauiApp Ve funkci za příkazy, které přidávají MainPage stránku jako jednu službu do aplikace, přidejte kód pro provedení následujících úloh:

    • Vytvořte řetězcovou proměnnou s názvem dbPath. Inicializovat tento řetězec výrazem FileAccessHelper.GetLocalFilePath("people.db3"). Soubor databáze, který aplikace používá, se nazývá people.db3 a aplikace uloží tento soubor do místního úložiště na zařízení.

    • Injektáž závislostí použijte k přidání PersonRepository třídy jako jednoúčelové služby do aplikace. Třída PersonRepository zveřejňuje konstruktor, který přebírá cestu k databázovému souboru jako řetězcový parametr.

    Dokončený kód funkce CreateMauiApp by měl vypadat takto:

    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. Uložte soubor MauiProgram.cs.

  4. V Průzkumník řešení rozbalte App.xaml a otevřete soubor App.xaml.cs.

  5. publicPřidejte vlastnost s static názvem PersonRepo. Tato vlastnost obsahuje PersonRepository objekt třídy App .

  6. Inicializace PersonRepo vlastnosti v konstruktoru přidáním PersonRepository parametru do konstruktoru a nastavením vlastnosti PersonRepo na hodnotu v tomto parametru. Dokončená App třída by měla vypadat takto:

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

Poznámka:

Proces injektáže závislostí automaticky naplní repo parametr konstruktoru.

Testování aplikace

  1. Sestavte řešení pomocí kombinace kláves CTRL+Shift+B.

  2. Po dokončení sestavení spusťte ladění pomocí klávesy F5. Jakmile se zobrazí uživatelské rozhraní, zadejte své jméno a vyberte Přidat osobu.

    Snímek obrazovky aplikace s úspěšnou zprávou o přidání záznamu

  3. Vyberte Získat všechny lidi a ověřte, že se zobrazí vaše jméno.

    Snímek obrazovky aplikace se seznamem všech záznamů v databázi

  4. Experimentujte přidáním dalších jmen a načtením seznamu uložených lidí.

  5. Vraťte se do sady Visual Studio nebo Visual Studio Code a pomocí Shift+F5 zastavte ladění.

  6. Restartujte aplikaci a vyberte Získat všechny lidi. Ověřte, že názvy, které jste dříve uložili, jsou stále uložené v databázi. Až budete hotovi, zavřete aplikaci.