Usare un database SQLite in un'app UWPUse a SQLite database in a UWP app

Puoi usare SQLite per archiviare e recuperare dati in un database leggero nel dispositivo dell'utente.You can use SQLite to store and retrieve data in a light-weight database on the user's device. Questa guida ti mostra come procedere.This guide shows you how.

Alcuni vantaggi dell'uso di SQLite per l'archiviazione localeSome benefits of using SQLite for local storage

✔️ SQLite è leggero e indipendente.SQLite is light-weight and self-contained. È una libreria di codice senza altre dipendenze.It's a code library without any other dependencies. Non richiede alcuna configurazione.There's nothing to configure.

✔️ Non è presente alcun server di database.There's no database server. Il client e il server vengono eseguiti nello stesso processo.The client and the server run in the same process.

✔️ SQLite è di dominio pubblico, pertanto puoi usarlo e distribuirlo liberamente con la tua app.SQLite is in the public domain so you can freely use and distribute it with your app.

✔️ SQLite funziona su più piattaforme e architetture.SQLite works across platforms and architectures.

Altre informazioni su SQLite sono disponibili qui.You can read more about SQLite here.

Scegliere un livello di astrazioneChoose an abstraction layer

È consigliabile usare Entity Framework Core o la libreria SQLite open source creata da Microsoft.We recommend that you use either the Entity Framework Core or the open-source SQLite library built by Microsoft.

Entity Framework CoreEntity Framework Core

Entity Framework (EF) è un mapper relazionale a oggetti che ti consente di gestire dati relazionali usando oggetti specifici del dominio.Entity Framework (EF) is an object-relational mapper that you can use to work with relational data by using domain-specific objects. Se hai già usato questo framework per lavorare con i dati in altre app .NET, puoi eseguire la migrazione del relativo codice a un'app UWP. Sarà sufficiente apportate le modifiche appropriate alla stringa di connessione.If you've already used this framework to work with data in other .NET apps, you can migrate that code to a UWP app and it will work with appropriate changes to the connection string.

Per provare, vedi Introduzione a EF Core nella piattaforma UWP (Universal Windows Platform) con un nuovo database.To try it out, see Getting started with EF Core on Universal Windows Platform (UWP) with a New Database.

Libreria SQLiteSQLite library

La libreria Microsoft.Data.Sqlite implementa le interfacce nello spazio dei nomi System.Data.Common.The Microsoft.Data.Sqlite library implements the interfaces in the System.Data.Common namespace. Microsoft gestisce attivamente queste implementazioni, che offrono un wrapper intuitivo per l'API SQLite nativa di basso livello.Microsoft actively maintains these implementations, and they provide an intuitive wrapper around the low-level native SQLite API.

Il resto di questa guida ti mostra come usare questa libreria.The rest of this guide helps you to use this library.

Configurare la soluzione per l'uso della libreria Microsoft.Data.SQliteSet up your solution to use the Microsoft.Data.SQlite library

Inizieremo con un progetto UWP di base, aggiungeremo una libreria di classi e quindi installeremo i pacchetti NuGet appropriati.We'll start with a basic UWP project, add a class library, and then install the appropriate Nuget packages.

Il tipo di libreria di classi da aggiungere alla soluzione e i pacchetti specifici da installare dipendono dalla versione minima di Windows SDK a cui l'app è destinata.The type of class library that you add to your solution, and the specific packages that you install depends on the minimum version of the Windows SDK that your app targets. Puoi trovare queste informazioni nella pagina delle proprietà del progetto UWP.You can find that information in the properties page of your UWP project.

Versione minima di Windows SDK

Usa una delle sezioni seguenti in base alla versione minima di Windows SDK a cui il progetto UWP è destinato.Use one of the following sections depending on the minimum version of the Windows SDK that your UWP project targets.

Versione minima del progetto non destinata a Fall Creators UpdateThe minimum version of your project does not target the Fall Creators Update

Se usi Visual Studio 2015, fai clic su ? ->Informazioni su Microsoft Visual Studio.If you're using Visual Studio 2015, click Help->About Microsoft Visual Studio. Nell'elenco dei programmi installati verifica quindi che il numero di versione di Gestione pacchetti NuGet sia 3.5 o superiore.Then in the list of installed programs, make sure that you have NuGet package manager version of 3.5 or higher. Se il numero di versione è inferiore, installa una versione successiva di NuGet da qui.If your version number is lower than that, install a later version of NuGet here. Nella pagina troverai tutte le versioni di NuGet elencate sotto l'intestazione Visual Studio 2015.On that page, you'll find all of the versions of Nuget listed beneath the Visual Studio 2015 heading.

Aggiungi quindi la libreria di classi alla soluzione.Next, add class library to your solution. Anche se non è necessario includere il codice di accesso ai dati in una libreria di classi, nel nostro esempio ne useremo una.You don't have to use a class library to contain your data access code, but we'll use one our example. Assegneremo il nome DataAccessLibrary alla libreria e il nome DataAccess alla classe nella libreria.We'll name the library DataAccessLibrary and we'll name the class in the library to DataAccess.

Screenshot che mostra la finestra di dialogo Aggiungi nuovo progetto con le opzioni Installati > Visual C# > Universale di Windows selezionate e l'opzione Libreria di classi evidenziata.

Fai clic con il pulsante destro del mouse sulla soluzione e quindi scegli Gestisci pacchetti NuGet per la soluzione.Right-click the solution, and then click Manage NuGet Packages for Solution.

Screenshot del pannello Esplora soluzioni con il progetto su cui è stato fatto clic con il pulsante destro del mouse e l'opzione Gestisci pacchetti NuGet per la soluzione evidenziata.

Se usi Visual Studio 2015, scegli la scheda Installati e verifica che il numero di versione del pacchetto Microsoft.NETCore.UniversalWindowsPlatform sia 5.2.2 o superiore.If you're using Visual Studio 2015, Choose the Installed tab, and make sure that the version number of the Microsoft.NETCore.UniversalWindowsPlatform package is 5.2.2 or higher.

Versione di .NETCore

Se non lo è, aggiorna il pacchetto a una versione più recente.If it isn't, update the package to a newer version.

Scegli la scheda Sfoglia e cerca il pacchetto Microsoft.Data.SQLite.Choose the Browse tab, and search for the Microsoft.Data.SQLite package. Installa la versione 1.1.1 (o una versione precedente) del pacchetto.Install version 1.1.1 (or lower) of that package.

Screenshot della finestra di dialogo Microsoft Data SQLite con callout del campo di testo Versione.

Passa alla sezione Aggiungere e recuperare dati in un database SQLite di questa guida.Move onto the Add and retrieve data in a SQLite database section of this guide.

Versione minima del progetto destinata a Fall Creators UpdateThe minimum version of your project targets the Fall Creators Update

Aumentare la versione minima del progetto UWP per Fall Creators Update offre alcuni vantaggi.There's a couple of benefits to raising the minimum version of your UWP project to the Fall Creators update.

Per prima cosa, potrai usare librerie .NET Standard 2.0 anziché librerie di classi normali.First off, you can use .NET Standard 2.0 libraries instead of regular class libraries. Questo ti consentirà di condividere il codice di accesso ai dati con qualsiasi altra app basata su .NET, ad esempio un'app WPF, Windows Forms, Android, iOS o ASP.NET.That means that you can share your data access code with any other .NET-based app such as a WPF, Windows Forms, Android, iOS, or ASP.NET app.

In secondo luogo, non sarà necessario che le librerie SQLite siano inserite nel pacchetto dell'app.Secondly, your app does not have to package SQLite libraries. L'app potrà invece usare la versione di SQLite installata con Windows.Instead, your app can use the version of SQLite that comes installed with Windows. Ciò presenta vari vantaggi.This helps you in a few ways.

✔️ Riduce le dimensioni dell'applicazione, perché non è necessario scaricare il file binario di SQLite e quindi inserirlo nel pacchetto dell'applicazione.Reduces the size of your application because you don't have to download the SQLite binary, and then package it as part of your application.

✔️ Consente di evitare il push di una nuova versione dell'app agli utenti nel caso in cui vengano pubblicate correzioni critiche di bug e di vulnerabilità di sicurezza di SQLite.Prevents you from having to push a new version of your app to users in the event that SQLite publishes critical fixes to bugs and security vulnerabilities in SQLite. La versione Windows di SQLite è gestita da Microsoft in collaborazione con SQLite.org.The Windows version of SQLite is maintained by Microsoft in coordination with SQLite.org.

✔️ Il tempo di caricamento dell'app può essere ridotto perché molto probabilmente la versione dell'SDK di SQLite sarà già caricata in memoria.App load time has the potential to be faster because most likely, the SDK version of SQLite will already be loaded into memory.

Per iniziare, aggiungiamo una libreria di classi .NET Standard 2.0 alla soluzione.Lets start by adding a .NET Standard 2.0 class library to your solution. Anche se non è necessario includere il codice di accesso ai dati in una libreria di classi, nel nostro esempio ne useremo una.It's not necessary that you use a class library to contain your data access code, but we'll use one our example. Assegneremo il nome DataAccessLibrary alla libreria e il nome DataAccess alla classe nella libreria.We'll name the library DataAccessLibrary and we'll name the class in the library to DataAccess.

Screenshot che mostra la finestra di dialogo Aggiungi nuovo progetto con le opzioni Installati > Visual C# > .NET Standard selezionate e l'opzione Libreria di classi evidenziata.

Fai clic con il pulsante destro del mouse sulla soluzione e quindi scegli Gestisci pacchetti NuGet per la soluzione.Right-click the solution, and then click Manage NuGet Packages for Solution.

Altro screenshot del pannello Esplora soluzioni con il progetto su cui è stato fatto clic con il pulsante destro del mouse e l'opzione Gestisci pacchetti NuGet evidenziata.

Nota

Se vuoi che la libreria di classi .NET Standard sia in grado di accedere alle cartelle delle app e agli asset di immagine dell'app UWP, dovrai contrassegnarla come EmbeddedResource e CopyAlways nelle proprietà.If you want your .NET Standard class library to be able to access app folders and image assets of your UWP app, you will need to mark it as EmbeddedResource and CopyAlways in its properties.

A questo punto puoi procedere in due modi.At this point, you have a choice. Puoi usare la versione di SQLite inclusa in Windows oppure, se per qualche motivo è opportuno usare una versione specifica di SQLite, puoi includere la libreria SQLite nel pacchetto.You can use the version of SQLite that is included with Windows or if you have some reason to use a specific version of SQLite, you can include the SQLite library in your package.

Per iniziare, useremo la versione di SQLite inclusa in Windows.Let's start with how you use the version of SQLite that included with Windows.

Per usare la versione di SQLite installata con WindowsTo use the version of SQLite that is installed with Windows

Scegli la scheda Sfoglia, cerca il pacchetto Microsoft.Data.SQLite.core e quindi installalo.Choose the Browse tab, and search for the Microsoft.Data.SQLite.core package, and then install it.

Pacchetto SQLite.core

Cerca il pacchetto SQLitePCLRaw.bundle_winsqlite3 e quindi installalo solo nel progetto UWP della soluzione.Search for the SQLitePCLRaw.bundle_winsqlite3 package, and then install it only to the UWP project in your solution.

Pacchetto SQLitePCLRaw

Per includere SQLite nell'appTo include SQLite with your app

Questa operazione non è necessaria.You don't have to do this. Se per qualche motivo è opportuno includere una versione specifica di SQLite nell'app, tuttavia, scegli la scheda Sfoglia e cerca il pacchetto Microsoft.Data.SQLite.But if you have a reason to include a specific version of SQLite with your app, choose the Browse tab, and search for the Microsoft.Data.SQLite package. Installa la versione 2.0 (o una versione precedente) del pacchetto.Install version 2.0 (or lower) of that package.

Screenshot che mostra la finestra di dialogo Microsoft Data SQLite con la versione stabile più recente 2.0.0 selezionata.

Aggiungere e recuperare dati in un database SQLiteAdd and retrieve data in a SQLite database

Eseguiremo queste operazioni:We'll do these things:

1️⃣ Preparare la classe di accesso ai dati.Prepare the data access class.

2️⃣ Inizializzare il database SQLite.Initialize the SQLite database.

3️⃣ Inserire dati nel database SQLite.Insert data into the SQLite database.

4️⃣ Recuperare dati dal database SQLite.Retrieve data from the SQLite database.

5️⃣ Aggiungere un'interfaccia utente di base.Add a basic user interface.

Preparare la classe di accesso ai datiPrepare the data access class

Dal progetto UWP aggiungi un riferimento al progetto DataAccessLibrary nella soluzione.From your UWP project, add a reference to the DataAccessLibrary project in your solution.

Libreria di classi di accesso ai dati

Aggiungi l'istruzione using seguente ai file App.xaml.cs e MainPage.xaml.cs del progetto UWP.Add the following using statement to the App.xaml.cs and MainPage.xaml.cs files in your UWP project.

using DataAccessLibrary;

Apri la classe DataAccess nella soluzione DataAccessLibrary e impostala come statica.Open the DataAccess class in your DataAccessLibrary solution and make that class static.

Nota

Il nostro esempio inserirà il codice di accesso ai dati in una classe statica, ma è una scelta di progettazione totalmente facoltativa.While our example will place data access code in a static class, it's just a design choice and is completely optional.

namespace DataAccessLibrary
{
    public static class DataAccess
    {

    }
}

Aggiungi le istruzioni using seguenti all'inizio di questo file.Add the following using statements to the top of this file.

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

Inizializzare il database SQLiteInitialize the SQLite database

Aggiungi un metodo per inizializzare il database SQLite alla classe DataAccess.Add a method to the DataAccess class that initializes the SQLite database.

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 locali dell'applicazione.This code creates the SQLite database and stores it in the application's local data store.

In questo esempio denominiamo il database sqlliteSample.db, ma puoi scegliere qualsiasi altro nome a condizione che tale nome venga usato in tutti gli oggetti SqliteConnection di cui crei un'istanza.In this example, we name the database sqlliteSample.db but you can use whatever name you want as long as you use that name in all SqliteConnection objects that you instantiate.

Nel costruttore del file App.xaml.cs del progetto UWP chiama il metodo InitializeDatabase della classe DataAccess.In the constructor of the App.xaml.cs file of your UWP project, call the InitializeDatabase method of the DataAccess class.

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

    DataAccess.InitializeDatabase();

}

Inserire dati nel database SQLiteInsert data into the SQLite database

Aggiungi un metodo per inserire dati nel database SQLite alla classe DataAccess.Add a method to the DataAccess class that inserts data into the SQLite database. Questo codice usa i parametri della query per impedire attacchi SQL injection.This code uses parameters in the query to prevent SQL injection attacks.

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

        db.Close();
    }

}

Recuperare dati dal database SQLiteRetrieve data from the SQLite database

Aggiungi un metodo per ottenere le righe di dati da un database SQLite.Add a method that gets rows of data from a SQLite database.

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

        db.Close();
    }

    return entries;
}

Il metodo Read procede scorrendo le righe dei dati restituiti.The Read method advances through the rows of returned data. Restituisce true se sono ancora presenti righe. In caso contrario restituisce false.It returns true if there are rows left, otherwise it returns false.

Il metodo GetString restituisce il valore della colonna specificata come stringa.The GetString method returns the value of the specified column as a string. Il metodo accetta un valore intero che rappresenta l'ordinale di colonna in base zero dei dati desiderati.It accepts an integer value that represents the zero-based column ordinal of the data that you want. Puoi usare metodi simili, ad esempio GetDataTime e GetBoolean.You can use similar methods such as GetDataTime and GetBoolean. Scegli un metodo in base al tipo di dati contenuto nella colonna.Choose a method based on what type of data the column contains.

Il parametro dell'ordinale non è importante in questo esempio perché selezioniamo tutte le voci di una singola colonna.The ordinal parameter isn't as important in this example because we are selecting all of the entries in a single column. Se la query include più colonne, tuttavia, usa il valore dell'ordinale per ottenere la colonna da cui vuoi recuperare i dati.However, if multiple columns are part of your query, use the ordinal value to obtain the column you want to pull data from.

Aggiungere un'interfaccia utente di baseAdd a basic user interface

Nel file MainPage.xaml del progetto UWP aggiungi il codice XAML seguente.In the MainPage.xaml file of the UWP project, add the following 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 un controllo TextBox che l'utente può usare per digitare una stringa che verrà aggiunta al database SQLite.This basic user interface gives the user a TextBox that they can use to type a string that we'll add to the SQLite database. Connetteremo il controllo Button dell'interfaccia utente a un gestore eventi che recupererà i dati dal database SQLite e li visualizzerà in ListView.We'll connect the Button in this UI to an event handler that will retrieve data from the SQLite database and then show that data in the ListView.

Nel file MainPage.xaml.cs aggiungi il gestore seguente.In the MainPage.xaml.cs file, add the following handler. Questo è il metodo che abbiamo associato all'evento Click di Button nell'interfaccia utente.This is the method that we associated with the Click event of the Button in the UI.

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

    Output.ItemsSource = DataAccess.GetData();
}

È tutto.That's it. Esplora Microsoft.Data.Sqlite per scoprire cos'altro puoi fare con il database SQLite.Explore the Microsoft.Data.Sqlite to see what other things you can do with your SQLite database. Visita i collegamenti riportati di seguito per scoprire altri modi per usare i dati nella tua app UWP.Check out the links below to learn about other ways to use data in your UWP app.

Passaggi successiviNext steps

Connettere l'app direttamente a un database di SQL ServerConnect your app directly to a SQL Server database

Vedi Usare un database SQL Server in un'app UWP.See Use a SQL Server database in a UWP app.

Condividere codice tra app diverse in piattaforme diverseShare code between different apps across different platforms

Vedi Condividere codice tra un'app desktop e un'app UWP.See Share code between desktop and UWP.

Aggiungere pagine master/dettagli con back-end SQL di AzureAdd master detail pages with Azure SQL back ends

Vedi l'esempio di database per gli ordini dei clienti.See Customer Orders Database sample.