Sdílet prostřednictvím


Kurz: Použití databáze SQLite v aplikaci Windows

SQLite poskytuje spolehlivé a jednoduché databázové řešení pro místní ukládání dat v aplikacích Windows. Na rozdíl od tradičních databázových systémů, které vyžadují samostatné instalace serveru a složité konfigurace, běží SQLite zcela v rámci procesu aplikace a ukládá data do jednoho souboru na zařízení uživatele.

V tomto kurzu se dozvíte, jak integrovat SQLite do aplikace WinUI pomocí doporučených knihoven pro přístup k datům od Microsoftu. Naučíte se nastavit databázi, vytvářet tabulky a implementovat základní operace s daty – a přitom budete hlídat osvědčené postupy zabezpečení, které chrání před běžnými ohroženími zabezpečení.

Čeho dosáhnete

V tomto kurzu se naučíte:

  • Konfigurace aplikace Windows tak, aby používala SQLite s knihovnou Microsoft.Data.SQLite
  • Vytvoření a inicializace místní databáze
  • Implementace zabezpečených metod vkládání a načítání dat
  • Vytvoření jednoduchého uživatelského rozhraní pro interakci s daty

Požadavky

K dokončení tohoto kurzu potřebujete:

  • Visual Studio 2022 nebo novější s pracovním zatížením Vývoj aplikací WinUI
  • Základní znalost jazyka C# a XAML
  • Znalost základních konceptů databáze

Tento přístup nabízí klíčová vylepšení

Použití SQLite pro místní úložiště dat v aplikaci Windows nabízí několik výhod:

  • Zjednodušené nasazení: Nevyžaduje se žádná samostatná instalace databázového serveru.
  • Vylepšené zabezpečení: Data zůstávají lokálně na zařízení uživatele.
  • Vylepšený výkon: Přímý přístup k souborům eliminuje latenci sítě.
  • Menší složitost: Jednosouborová databáze zjednodušuje zálohování a migraci

Techniky, které se naučíte používat pro všechny Windows aplikace, které potřebují ukládat strukturovaná data místně, od jednoduchého úložiště nastavení až po složité scénáře správy dat.

Výhody SQLite pro místní úložiště

✔️ SQLite je odlehčená a samostatná. Jedná se o knihovnu kódu bez jakýchkoli dalších závislostí. Není nic ke konfiguraci.

✔️ Neexistuje žádný databázový server. Klient a server běží ve stejném procesu.

✔️ SQLite je ve veřejné doméně, takže ji můžete volně používat a distribuovat s vaší aplikací.

✔️ SQLite funguje napříč platformami a architekturami.

Další informace o SQLite najdete tady.

Volba abstraktní vrstvy

Doporučujeme používat Entity Framework Core nebo open source knihovnu SQLite vytvořenou Microsoftem.

Entity Framework Core

Entity Framework (EF) je objektově-relační mapovač, který můžete použít k práci s relačními daty pomocí objektů specifických pro doménu. Pokud jste už tuto architekturu použili k práci s daty v jiných aplikacích .NET, můžete použít stejný kód v aplikaci WinUI a bude fungovat s příslušnými změnami connection string.

Pokud si to chcete vyzkoušet, přečtěte si téma Začínáme s EF Core.

Knihovna SQLite

Knihovna Microsoft.Data.Sqlite implementuje rozhraní v oboru názvů System.Data.Common. Microsoft tyto implementace aktivně udržuje a poskytuje intuitivní obálku kolem nativního rozhraní SQLite API nízké úrovně.

Zbývající část tohoto průvodce vám pomůže používat tuto knihovnu.

Nastavení řešení pro použití knihovny Microsoft.Data.SQLite

Začneme základním projektem WinUI a pak nainstalujeme balíček NuGet SQLite. Pokyny k vytvoření prvního projektu WinUI najdete v tématu Vytvoření aplikace WinUI .

Všechny podporované verze Windows podporují SQLite, takže vaše aplikace nemusí zabalit knihovny SQLite. Místo toho může vaše aplikace používat verzi SQLite, která je nainstalovaná s Windows. To vám pomůže několika způsoby.

✔️ Zmenšuje velikost aplikace, protože nemusíte stahovat binární soubor SQLite a pak ji zabalit jako součást aplikace.

✔️ Zabrání uživatelům v nabízení nové verze aplikace v případě, že SQLite publikuje kritické opravy chyb a ohrožení zabezpečení v SQLite. Microsoft udržuje Windows verzi SQLite v koordinaci s SQLite.org.

✔️ Doba načítání aplikace může být rychlejší, protože s největší pravděpodobností se do paměti načte verze sady SDK SQLite.

Začněme přidáním třídy do projektu s názvem DataAccess. Pokud plánujete sdílet logiku přístupu k datům s jiným kódem klienta, můžete použít projekt knihovny tříd .NET, který bude obsahovat kód pro přístup k datům, ale v našem příkladu ho nebudeme používat.

  1. Klikněte pravým tlačítkem myši na řešení a potom klikněte na Spravovat balíčky NuGet pro řešení.

    A snímek obrazovky Průzkumníka řešení ve Visual Studio se zvýrazněnou možností Spravovat balíčky NuGet.

    V tuto chvíli máte na výběr. Můžete použít verzi SQLite, která je součástí Windows nebo pokud máte nějaký důvod k použití konkrétní verze SQLite, můžete do balíčku zahrnout knihovnu SQLite. Budeme používat verzi SQLite, která je součástí Windows.

  2. Zvolte kartu Procházet , vyhledejte balíček Microsoft.Data.SQLite a nainstalujte nejnovější stabilní verzi.

    Balíček NuGet SQLite

Přidání a načtení dat v databázi SQLite

Provedeme tyto akce:

1️⃣ Připravte třídu přístupu k datům.

2️⃣ Inicializace databáze SQLite.

3️⃣ Vložte data do databáze SQLite.

4️⃣ Načtení dat z databáze SQLite

5️⃣ Přidat základní uživatelské rozhraní.

Příprava třídy přístupu k datům

DataAccess Otevřete třídu v projektu a nastavte ji jako statickou.

Poznámka:

I když v příkladu umístíte kód pro přístup k datům do statické třídy, jedná se o volbu návrhu a je zcela nepovinná.

public static class DataAccess
{
}

Na začátek tohoto souboru přidejte následující using příkazy.

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

Inicializace databáze SQLite

Přidejte metodu DataAccess do třídy, která inicializuje databázi 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 (var 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)";

        var createTable = new SqliteCommand(tableCommand, db);

        createTable.ExecuteReader();
    }
}

Poznámka:

Výše uvedený kód, který používá ApplicationData členy, bude fungovat pouze pro zabalené aplikace spuštěné v kontejneru aplikací. Všechny ostatní aplikace Windows by měly přistupovat ke členům ApplicationData prostřednictvím třídy ApplicationDataManager.

Tento kód vytvoří databázi SQLite a uloží ji do místního úložiště dat aplikace.

V tomto příkladu pojmenujeme databázi sqlliteSample.db, ale můžete použít libovolný název, pokud budete tento název používat ve všech objektech SqliteConnection, které instanciujete. V produkční aplikaci by měly být informace o připojení, jako je název souboru databáze, uloženy v konfiguraci aplikace místo napevno zakódovaného (viz Přidání konfigurace aplikace Azure pomocí služby Připojené služby Visual Studio).

V konstruktoru App.xaml.cs souboru projektu zavolejte InitializeDatabase metodu DataAccess třídy. Tím zajistíte, že se databáze vytvoří nebo otevře při každém spuštění aplikace.

public App()
{
    this.InitializeComponent();

    DataAccess.InitializeDatabase();
}

Vložení dat do databáze SQLite

Přidejte metodu DataAccess do třídy, která vkládá data do databáze SQLite. Tento kód používá parametry v dotazu, aby se zabránilo útokům prostřednictvím injektáže SQL.

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

        var 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();
    }

}

Načtení dat z databáze SQLite

Přidejte metodu, která získá všechny řádky dat z tabulky v naší databázi SQLite.

public static List<string> GetData()
{
    var entries = new List<string>();
    string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path,
                                 "sqliteSample.db");
    using (var db = new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();
        var selectCommand = new SqliteCommand
            ("SELECT Text_Entry from MyTable", db);

        SqliteDataReader query = selectCommand.ExecuteReader();

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

    return entries;
}

Metoda Read prochází řádky vrácených dat. Vrátí true, pokud zbývají řádky, jinak vrátí false.

Metoda GetString vrátí hodnotu zadaného sloupce jako řetězec. Přijímá celočíselnou hodnotu, která představuje pořadové číslo sloupce, začínající od nuly, dat, která chcete. Můžete použít podobné metody, jako je GetDataTime a GetBoolean. Zvolte metodu na základě typu dat, která sloupec obsahuje.

Řadový parametr není v tomto příkladu tak důležitý, protože vybíráme všechny položky v jednom sloupci. Pokud je však součástí dotazu více sloupců, použijte řadovou hodnotu k získání sloupce, ze kterého chcete načíst data.

Přidání základního uživatelského rozhraní

Do souboru MainWindow.xaml projektu přidejte následující XAML.

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

Toto základní uživatelské rozhraní dává uživateli možnost TextBox , kterou může použít k zadání řetězce, který přidáme do databáze SQLite. V tomto uživatelském Button rozhraní se připojíme k obslužné rutině události, která načte data z databáze SQLite a pak tato data zobrazí v souboru ListView.

Do souboru MainWindow.xaml.cs přidejte následující obslužnou rutinu. Toto je metoda, kterou jsme přidružli k Click události Button v uživatelském rozhraní.

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

    Output.ItemsSource = DataAccess.GetData();
}

Také chceme mít jistotu, že se při spuštění aplikace načtou všechna existující data. Přidejte řádek kódu do konstruktoru MainWindow pro zavolání GetData().

public MainWindow()
{
    this.InitializeComponent();

    Output.ItemsSource = DataAccess.GetData();
}

Hotovo. Prozkoumejte Microsoft.Data.Sqlite a zjistěte, co dalšího můžete dělat s databází SQLite. Podívejte se na následující odkazy a seznamte se s dalšími způsoby použití dat v aplikacích Windows.

Vyhněte se útokům prostřednictvím injektáže SQL

Kód v tomto příkladu používá parametrizované dotazy k prevenci útoků prostřednictvím injektáže SQL. Nikdy nezřetězte uživatelský vstup do řetězce dotazu SQL. Vždy používejte parametry. Můžete požádat Copilot o další tipy, jak se vyhnout útokům prostřednictvím injektáže SQL.

Následující text ukazuje příklad výzvy pro Copilot:

Can you provide some best practices to avoid SQL injection attacks when writing SQLite queries in C# code?

Copilot využívá AI, takže jsou možné překvapení a chyby. Další informace najdete v tématu Copilot nejčastější dotazy.

Připojení aplikace přímo k databázi SQL Server

Viz Použití databáze SQL Server v aplikaci Windows.

Sdílení kódu mezi různými aplikacemi na různých platformách

Viz Sdílení kódu mezi desktopem a UPW.

Přidání hlavních a detailních stránek se zázemím Azure SQL

Viz ukázka databáze Customer Orders.