Delen via


Een SQLite-database gebruiken in een UWP-app

U kunt SQLite gebruiken om gegevens op te slaan en op te halen in een lichtgewicht database op het apparaat van de gebruiker. In deze handleiding ziet u hoe u dit doet.

Enkele voordelen van het gebruik van SQLite voor lokale opslag

✔️ SQLite is licht en zelfstandig. Het is een codebibliotheek zonder andere afhankelijkheden. Er is niets te configureren.

✔️ Er is geen databaseserver. De client en de server worden in hetzelfde proces uitgevoerd.

✔️ SQLite bevindt zich in het openbare domein, zodat u deze vrij kunt gebruiken en distribueren met uw app.

✔️ SQLite werkt op verschillende platforms en architecturen.

Meer informatie over SQLite vindt u hier.

Een abstractielaag kiezen

U wordt aangeraden de Entity Framework Core of de opensource-SQLite-bibliotheek te gebruiken gebouwd door Microsoft.

Entity Framework Core

Entity Framework (EF) is een object-relationele mapper die u kunt gebruiken om met relationele gegevens te werken met behulp van domeinspecifieke objecten. Als u dit framework al hebt gebruikt om met gegevens in andere .NET-apps te werken, kunt u die code migreren naar een UWP-app en deze werkt met de juiste wijzigingen in de verbindingsreeks.

Zie Aan de slag met EF Coreom het uit te proberen.

SQLite-bibliotheek

De bibliotheek Microsoft.Data.Sqlite implementeert de interfaces in de naamruimte System.Data.Common. Microsoft onderhoudt deze implementaties actief en biedt een intuïtieve wrapper rond de systeemeigen SQLite-API op laag niveau.

De rest van deze handleiding helpt u bij het gebruik van deze bibliotheek.

Uw oplossing instellen voor het gebruik van de Microsoft.Data.SQlite-bibliotheek

We beginnen met een eenvoudig UWP-project en installeren vervolgens de juiste Nuget-pakketten.

Notitie

Zorg ervoor dat u de Microsoft.Data.Sqlite' package and not 'Microsoft.Data.Sqlite.Coreinstalleert. Met dit pakket wordt Microsoft.Data.Sqlite.Core geïnstalleerd als een afhankelijkheid.

Alle ondersteunde versies van Windows ondersteunen SQLite, zodat uw app geen SQLite-bibliotheken hoeft te verpakken. In plaats daarvan kan uw app de versie van SQLite gebruiken die wordt geïnstalleerd met Windows. Dit helpt u op een aantal manieren.

✔️ Vermindert de grootte van uw toepassing omdat u het binaire bestand SQLite niet hoeft te downloaden en deze vervolgens inpakt als onderdeel van uw toepassing.

✔️ Hiermee voorkomt u dat u een nieuwe versie van uw app naar gebruikers moet pushen in het geval dat SQLite kritieke oplossingen publiceert op bugs en beveiligingsproblemen in SQLite. De Windows-versie van SQLite wordt onderhouden door Microsoft in coördinatie met SQLite.org.

✔️ De laadtijd van de app kan sneller zijn, omdat de SDK-versie van SQLite waarschijnlijk al in het geheugen wordt geladen.

Laten we beginnen met het toevoegen van een klasse aan uw UWP-project met de naam DataAccess. U kunt een .NET Standard-klassebibliotheekproject gebruiken om uw code voor gegevenstoegang te bevatten, maar we gebruiken er geen in ons voorbeeld.

Klik met de rechtermuisknop op de oplossing en klik vervolgens op NuGet-pakketten beheren voor oplossing.

Een andere schermopname van het deelvenster Solution Explorer met de rechtermuisknop op het project geklikt en de optie NuGet-pakketten beheren gemarkeerd.

Op dit moment hebt u een keuze. U kunt de versie van SQLite gebruiken die is opgenomen in Windows of als u een bepaalde reden hebt om een specifieke versie van SQLite te gebruiken, kunt u de SQLite-bibliotheek in uw pakket opnemen. We gaan de versie van SQLite gebruiken die is opgenomen in Windows.

Kies het tabblad Bladeren, zoek naar het Microsoft.Data.SQLite.Core-pakket en installeer vervolgens de nieuwste stabiele versie.

SQLite Core-pakket

Gegevens toevoegen en ophalen in een SQLite-database

We doen het volgende:

1️⃣ Bereid de gegevenstoegangsklasse voor.

2️⃣ Initialiseer de SQLite-database.

3️⃣ Gegevens invoegen in de SQLite-database.

4️⃣ Gegevens ophalen uit de SQLite-database.

5️⃣ Een eenvoudige gebruikersinterface toevoegen.

De gegevenstoegangsklasse voorbereiden

Open de DataAccess-klasse in uw project en maak die klasse statisch.

Notitie

Hoewel in ons voorbeeld gegevenstoegangscode in een statische klasse wordt gebruikt, is het slechts een ontwerpkeuze en is dit volledig optioneel.

public static class DataAccess
{

}

Voeg de volgende using-verklaringen toe bovenaan dit bestand.

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

De SQLite-database initialiseren

Voeg een methode toe aan de DataAccess klasse waarmee de SQLite-database wordt geïnitialiseerd.

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

Met deze code wordt de SQLite-database gemaakt en opgeslagen in het lokale gegevensarchief van de toepassing.

In dit voorbeeld noemen we de database sqlliteSample.db, maar u kunt elke gewenste naam gebruiken zolang u die naam gebruikt in alle SqliteConnection objecten die u instantieert.

Roep in de constructor van het App.xaml.cs-bestand van uw UWP-project de InitializeDatabase methode van de DataAccess-klasse aan.

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;

    DataAccess.InitializeDatabase();
}

Gegevens invoegen in de SQLite-database

Voeg een methode toe aan de DataAccess-klasse waarmee gegevens worden ingevoegd in de SQLite-database. Deze code maakt gebruik van parameters in de query om SQL-injectieaanvallen te voorkomen.

public static void AddData(string inputText)
{
    string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
    using (SqliteConnection db =
      new SqliteConnection($"Filename={dbpath}"))
    {
        SQLitePCL.Batteries.Init();
        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();
    }

}

Gegevens ophalen uit de SQLite-database

Voeg een methode toe waarmee rijen met gegevens uit een SQLite-database worden opgehaald.

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

De methode Read gaat door de rijen met geretourneerde gegevens. Het retourneert true als er nog rijen over zijn, anders retourneert het false.

De methode GetString retourneert de waarde van de opgegeven kolom als een tekenreeks. Het accepteert een geheel getal dat de op nul gebaseerde kolom ordinaal van de gewenste gegevens vertegenwoordigt. U kunt vergelijkbare methoden gebruiken, zoals GetDataTime- en GetBoolean. Kies een methode op basis van het type gegevens dat de kolom bevat.

De rangtelparameter is in dit voorbeeld niet zo belangrijk omdat we alle vermeldingen in één kolom selecteren. Als meerdere kolommen echter deel uitmaken van uw query, gebruikt u de rangtelwaarde om de kolom te verkrijgen waaruit u gegevens wilt ophalen.

Een eenvoudige gebruikersinterface toevoegen

Voeg in het bestand MainPage.xaml van het UWP-project de volgende XAML toe.

<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>

Deze eenvoudige gebruikersinterface geeft de gebruiker een TextBox die ze kunnen gebruiken om een tekenreeks te typen die we toevoegen aan de SQLite-database. We verbinden de Button in deze gebruikersinterface met een gebeurtenis-handler die gegevens ophaalt uit de SQLite-database en die gegevens vervolgens weergeeft in de ListView.

Voeg in het bestand MainPage.xaml.cs de volgende handler toe. Dit is de methode die we hebben gekoppeld aan de Click gebeurtenis van de Button in de UI.

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

    Output.ItemsSource = DataAccess.GetData();
}

We willen er ook zeker van zijn dat alle bestaande gegevens worden geladen wanneer de toepassing wordt gestart. Voeg een coderegel toe aan de MainPage constructor om GetData()aan te roepen.

public MainPage()
{
    this.InitializeComponent();

    Output.ItemsSource = DataAccess.GetData();
}

Dat is het. Verken de Microsoft.Data.Sqlite- om te zien wat u nog meer kunt doen met uw SQLite-database. Bekijk de onderstaande koppelingen voor meer informatie over andere manieren om gegevens in uw UWP-app te gebruiken.

Volgende stappen

Uw app rechtstreeks verbinden met een SQL Server-database

Zie Een SQL Server-database gebruiken in een UWP-app.

Code delen tussen verschillende apps op verschillende platforms

Zie Code delen tussen desktop- en UWP-toepassingen.

Basisdetailpagina's toevoegen met Azure SQL-back-ends

Zie voorbeeld van de database klantorders.