Condividi tramite


Usare un database SQLite in un'app UWP

È possibile usare SQLite per archiviare e recuperare i dati in un database leggero nel dispositivo dell'utente. Questa guida illustra come.

Alcuni vantaggi dell'uso di SQLite per l'archiviazione locale

✔️ SQLite è leggero e autonomo. Si tratta di una libreria di codice senza altre dipendenze. Non c'è nulla da configurare.

✔️ Nessun server di database. Il client e il server vengono eseguiti nello stesso processo.

✔️ SQLite si trova nel dominio pubblico in modo che sia possibile usarlo e distribuirlo liberamente con l'app.

✔️ SQLite funziona su piattaforme e architetture.

Altre informazioni su SQLite sono disponibili qui.

Scegliere un livello di astrazione

È consigliabile usare Entity Framework Core o la libreria SQLite open source compilata da Microsoft.

Entity Framework Core (un framework ORM per la gestione dei database nello sviluppo software)

Entity Framework (EF) è un mapper relazionale a oggetti che è possibile usare per lavorare con dati relazionali usando oggetti specifici del dominio. Se hai già usato questo framework per lavorare con i dati in altre app .NET, puoi eseguire la migrazione di tale codice a un'app UWP e funzionerà con le modifiche appropriate alla stringa di connessione.

Per provare, vedere Introduzione a EF Core.

Libreria SQLite

La libreria Microsoft.Data.Sqlite implementa le interfacce nello spazio dei nomi System.Data.Common. Microsoft gestisce attivamente queste implementazioni e fornisce un wrapper intuitivo per l'API SQLite nativa di basso livello.

La parte restante di questa guida consente di usare questa libreria.

Configurare la soluzione per l'uso della libreria Microsoft.Data.SQlite

Inizieremo con un progetto UWP di base e quindi installeremo i pacchetti NuGet appropriati.

Nota

Assicurati di installare il Microsoft.Data.Sqlite' package and not 'Microsoft.Data.Sqlite.Core. Questo pacchetto installerà Microsoft.Data.Sqlite.Core come dipendenza.

Tutte le versioni supportate di Windows supportano SQLite, quindi l'app non deve creare pacchetti di librerie SQLite. L'app può invece usare la versione di SQLite installata con Windows. Questo ti aiuta in alcuni modi.

✔️ Riduce le dimensioni dell'applicazione perché non è necessario scaricare il file binario SQLite e quindi crearne il pacchetto come parte dell'applicazione.

✔️ Impedisce di dover eseguire il push di una nuova versione dell'app agli utenti nel caso in cui SQLite pubblica correzioni critiche per bug e vulnerabilità di sicurezza in SQLite. La versione windows di SQLite viene gestita da Microsoft in coordinamento con SQLite.org.

✔️ Il tempo di caricamento dell'app può essere più veloce perché probabilmente la versione SDK di SQLite verrà già caricata in memoria.

Per iniziare, aggiungere una classe al progetto UWP denominato DataAccess. È possibile usare un progetto di libreria di classi .NET Standard per contenere il codice di accesso ai dati, ma non ne verrà usato uno nell'esempio.

Fare clic con il pulsante destro del mouse sulla soluzione e quindi scegliere Gestisci pacchetti NuGet per la soluzione.

Un altro screenshot del pannello

A questo punto, hai una scelta. È possibile usare la versione di SQLite inclusa in Windows o se si ha qualche motivo per usare una versione specifica di SQLite, è possibile includere la libreria SQLite nel pacchetto. Useremo la versione di SQLite inclusa in Windows.

Scegliere la scheda Sfoglia, cercare il pacchetto Microsoft.Data.SQLite.Core e quindi installare la versione stabile più recente.

pacchetto SQLite Core

Aggiungere e recuperare dati in un database SQLite

Queste operazioni verranno eseguite:

1️⃣ Preparare la classe di accesso ai dati.

2️⃣ Inizializzare il database SQLite.

3️⃣ Inserire dati nel database SQLite.

4️⃣ Recuperare dati dal database SQLite.

5️⃣ Aggiungere un'interfaccia utente di base.

Preparare la classe di accesso ai dati

Aprire la classe DataAccess nel progetto e renderla statica.

Nota

Mentre l'esempio inserisce il codice di accesso ai dati in una classe statica, è solo una scelta di progettazione ed è completamente facoltativo.

public static class DataAccess
{

}

Aggiungere le istruzioni using seguenti all'inizio di questo file.

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

Inizializzare il database SQLite

Aggiungere un metodo alla classe DataAccess che inizializza il database 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 (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();
    }
}

Questo codice crea il database SQLite e lo archivia nell'archivio dati locale dell'applicazione.

In questo esempio, assegniamo il nome sqlliteSample.db al database, ma è possibile usare qualsiasi nome desiderato purché lo si utilizzi in tutti gli oggetti SqliteConnection di cui si crea un'istanza.

Nel costruttore del file App.xaml.cs del progetto UWP, chiama il metodo InitializeDatabase della classe DataAccess.

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

    DataAccess.InitializeDatabase();
}

Inserire dati nel database SQLite

Aggiungere un metodo alla classe DataAccess che inserisce dati nel database SQLite. Questo codice utilizza i parametri nella query per prevenire attacchi di SQL injection.

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

}

Recuperare dati dal database SQLite

Aggiungere un metodo che ottiene righe di dati da un database SQLite.

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

Il metodo Read procede attraverso le righe di dati restituiti. Restituisce true se sono presenti righe lasciate; in caso contrario, restituisce false.

Il metodo GetString restituisce il valore della colonna specificata come stringa. Accetta un valore intero che rappresenta l'ordinale di colonna in base zero dei dati desiderati. È possibile usare metodi simili, ad esempio GetDataTime e GetBoolean. Scegliere un metodo in base al tipo di dati contenuti nella colonna.

Il parametro ordinale non è importante in questo esempio perché vengono selezionate tutte le voci in una singola colonna. Tuttavia, se più colonne fanno parte della query, usare il valore ordinale per ottenere la colonna da cui eseguire il pull dei dati.

Aggiungere un'interfaccia utente di base

Nel file MainPage.xaml del progetto UWP, aggiungere il seguente XAML.

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

Questa interfaccia utente di base offre all'utente un TextBox che può usare per digitare una stringa che verrà aggiunta al database SQLite. Nell'interfaccia utente, il Button verrà connesso a un gestore eventi che recupererà i dati dal database SQLite e li mostrerà nel ListView.

Nel file MainPage.xaml.cs aggiungere il gestore seguente. Questo è il metodo associato all'evento Click del Button nell'interfaccia utente.

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

    Output.ItemsSource = DataAccess.GetData();
}

Si vuole anche assicurarsi che tutti i dati esistenti vengano caricati all'avvio dell'applicazione. Aggiungere una riga di codice al costruttore MainPage per chiamare GetData().

public MainPage()
{
    this.InitializeComponent();

    Output.ItemsSource = DataAccess.GetData();
}

Questo è tutto. Esplorare il Microsoft.Data.Sqlite per vedere quali altre operazioni è possibile eseguire con il database SQLite. Vedi i collegamenti seguenti per informazioni su altri modi per usare i dati nella tua app UWP.

Passaggi successivi

Connettere l'app direttamente a un database di SQL Server

Vedere Usare un database SQL Server in un'app UWP.

Condividere il codice tra app diverse tra piattaforme diverse

Consulta per condividere il codice tra desktop e UWP.

Aggiungere pagine di dettaglio master con back-end sql di Azure

Consulta il database di esempio degli ordini cliente .