Usar um banco de dados do SQLite em um aplicativo UWPUse a SQLite database in a UWP app

É possível usar o SQLite para armazenar e recuperar dados em um banco de dados leve no dispositivo do usuário.You can use SQLite to store and retrieve data in a light-weight database on the user's device. Este guia mostra como fazer isso.This guide shows you how.

Alguns benefícios do uso do SQLite para armazenamento localSome benefits of using SQLite for local storage

✔️ O SQLite é leve e autossuficiente.SQLite is light-weight and self-contained. É uma biblioteca de código sem nenhuma outra dependência.It's a code library without any other dependencies. Não há nada a ser configurado.There's nothing to configure.

✔️ Não há nenhum servidor de banco de dados.There's no database server. O cliente e o servidor são executados no mesmo processo.The client and the server run in the same process.

✔️ O SQLite é de domínio público, então você pode usá-lo livremente e distribuí-lo com seu aplicativo.SQLite is in the public domain so you can freely use and distribute it with your app.

✔️ O SQLite funciona em várias arquiteturas e plataformas.SQLite works across platforms and architectures.

Você pode ler mais sobre o SQLite aqui.You can read more about SQLite here.

Escolher uma camada de abstraçãoChoose an abstraction layer

Recomendamos usar o Entity Framework Core ou a biblioteca SQLite open-source criada pela 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

O EF (Entity Framework) é um mapeador relacional de objeto que pode ser usado para trabalhar com os dados relacionais usando objetos específicos de domínio.Entity Framework (EF) is an object-relational mapper that you can use to work with relational data by using domain-specific objects. Caso já tenha usado essa estrutura para trabalhar com os dados em outros aplicativos .NET, poderá migrar esse código para um aplicativo UWP e ele funcionará com as alterações apropriadas feitas na cadeia de conexão.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.

Para experimentar, confira Introdução ao EF Core na UWP (Plataforma Universal do Windows) com um novo banco de dados.To try it out, see Getting started with EF Core on Universal Windows Platform (UWP) with a New Database.

Biblioteca SQLiteSQLite library

A biblioteca Microsoft.Data.Sqlite implementa as interfaces no namespace System.Data.Common.The Microsoft.Data.Sqlite library implements the interfaces in the System.Data.Common namespace. A Microsoft mantém ativamente essas implementações e elas fornecem um wrapper intuitivo em torno da API do SQLite nativo de baixo nível.Microsoft actively maintains these implementations, and they provide an intuitive wrapper around the low-level native SQLite API.

O restante deste guia ajuda você a usar essa biblioteca.The rest of this guide helps you to use this library.

Configurar sua solução para usar a biblioteca Microsoft.Data.SQliteSet up your solution to use the Microsoft.Data.SQlite library

Vamos começar com um projeto UWP básico, adicionar uma biblioteca de classes e, em seguida, instalar os pacotes NuGet corretos.We'll start with a basic UWP project, add a class library, and then install the appropriate Nuget packages.

O tipo de biblioteca de classes que você adiciona à sua solução e os pacotes específicos que você instala dependem da versão mínima do SDK do Windows a que seu aplicativo se destina.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. Essas informações estão na página de propriedades do seu projeto da UWP.You can find that information in the properties page of your UWP project.

Versão mínima do SDK do Windows

Use uma das seguintes seções dependendo da versão mínima do SDK do Windows a que seu projeto UWP se destina.Use one of the following sections depending on the minimum version of the Windows SDK that your UWP project targets.

A versão mínima do seu projeto não se destina à atualização do Fall CreatorsThe minimum version of your project does not target the Fall Creators Update

Se você estiver usando o Visual Studio 2015, clique em Ajuda->Sobre o Microsoft Visual Studio.If you're using Visual Studio 2015, click Help->About Microsoft Visual Studio. Em seguida, na lista de programas instalados, verifique se você tem a versão do gerenciador de pacotes NuGet 3.5 ou posterior.Then in the list of installed programs, make sure that you have NuGet package manager version of 3.5 or higher. Se o número de versão for menor que isso, instale uma versão posterior do NuGet aqui.If your version number is lower than that, install a later version of NuGet here. Nessa página, você encontrará todas as versões do NuGet listadas abaixo do título Visual Studio 2015.On that page, you'll find all of the versions of Nuget listed beneath the Visual Studio 2015 heading.

Em seguida, adicione uma biblioteca de classes à solução.Next, add class library to your solution. Não é preciso usar uma biblioteca de classes para conter o código de acesso a dados, mas vamos usar uma em nosso exemplo.You don't have to use a class library to contain your data access code, but we'll use one our example. Chamaremos a biblioteca de DataAccessLibrary e chamaremos a classe na biblioteca de DataAccess.We'll name the library DataAccessLibrary and we'll name the class in the library to DataAccess.

Captura de tela mostrando a caixa de diálogo Adicionar Novo Projeto mostrando Instalado > Visual C Sharp > Universal do Windows selecionado e a opção Biblioteca de Classes realçada.

Clique com o botão direito do mouse na solução e clique em Gerenciar pacotes NuGet para solução.Right-click the solution, and then click Manage NuGet Packages for Solution.

Captura de tela do painel Gerenciador de Soluções com o projeto clicado com o botão direito do mouse e a opção Gerenciar Pacotes NuGet para Solução realçada.

Se você estiver usando o Visual Studio 2015, escolha a guia Instalado e verifique se o número de versão do pacote Microsoft.NETCore.UniversalWindowsPlatform é 5.2.2 ou posterior.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.

Versão do .NETCore

Se não for, atualize o pacote para uma versão mais recente.If it isn't, update the package to a newer version.

Escolha a guia Procurar e procure o pacote Microsoft.Data.SQLite.Choose the Browse tab, and search for the Microsoft.Data.SQLite package. Instale a versão 1.1.1 (ou inferior) do mesmo pacote.Install version 1.1.1 (or lower) of that package.

Captura de tela da caixa de diálogo Microsoft Data SQLite com o campo de texto Versão em destaque.

Vá para a seção Adicionar e recuperar dados em um banco de dados SQLite deste guia.Move onto the Add and retrieve data in a SQLite database section of this guide.

A versão mínima do seu projeto se destina à atualização do Fall CreatorsThe minimum version of your project targets the Fall Creators Update

Há alguns benefícios em aumentar a versão mínima do seu projeto UWP para a atualização do Fall Creators.There's a couple of benefits to raising the minimum version of your UWP project to the Fall Creators update.

Primeiro, você pode usar as bibliotecas do .NET Standard 2.0 em vez de bibliotecas de classes regulares.First off, you can use .NET Standard 2.0 libraries instead of regular class libraries. Isso significa que você pode compartilhar seu código de acesso a dados com qualquer outro aplicativo com base em .NET, como um aplicativo WPF, Windows Forms, Android, iOS ou 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.

Em segundo lugar, o aplicativo não precisa empacotar bibliotecas do SQLite.Secondly, your app does not have to package SQLite libraries. Em vez disso, o aplicativo pode usar a versão do SQLite que vem instalado com o Windows.Instead, your app can use the version of SQLite that comes installed with Windows. Isso ajuda você de algumas maneiras.This helps you in a few ways.

✔️ Reduz o tamanho do aplicativo, pois você não precisa baixar o binário do SQLite e empacotá-lo como parte do aplicativo.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.

✔️ Impede que você precise efetuar push de uma nova versão do aplicativo para os usuários no caso de a SQLite publicar correções críticas para bugs e vulnerabilidades de segurança no 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. A versão Windows do SQLite é mantida pela Microsoft em coordenação com o SQLite.org.The Windows version of SQLite is maintained by Microsoft in coordination with SQLite.org.

✔️ O tempo de carregamento do aplicativo tem o potencial de ser mais rápido porque, provavelmente, a versão do SDK do SQLite já será carregada na memória.App load time has the potential to be faster because most likely, the SDK version of SQLite will already be loaded into memory.

Vamos começar adicionando uma biblioteca de classes do .NET Standard 2.0 à solução.Lets start by adding a .NET Standard 2.0 class library to your solution. Não é necessário usar uma biblioteca de classes para conter o código de acesso a dados, mas vamos usar uma em nosso exemplo.It's not necessary that you use a class library to contain your data access code, but we'll use one our example. Chamaremos a biblioteca de DataAccessLibrary e chamaremos a classe na biblioteca de DataAccess.We'll name the library DataAccessLibrary and we'll name the class in the library to DataAccess.

Captura de tela mostrando a caixa de diálogo Adicionar Novo Projeto mostrando Instalado > Visual C Sharp > .NET Standard selecionado e a opção Biblioteca de Classes realçada.

Clique com o botão direito do mouse na solução e clique em Gerenciar pacotes NuGet para solução.Right-click the solution, and then click Manage NuGet Packages for Solution.

Outra captura de tela do painel Gerenciador de Soluções com o projeto clicado com o botão direito do mouse e a opção Gerenciar Pacotes NuGet realçada.

Observação

Se você desejar que a sua biblioteca de classes do .NET Standard seja capaz de acessar as pastas de aplicativo e os ativos de imagem do seu aplicativo UWP, você precisará marcá-la como EmbeddedResource e CopyAlways em propriedades.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.

Neste ponto, você tem uma opção.At this point, you have a choice. É possível usar a versão do SQLite incluída no Windows ou, se você tiver algum motivo para usar uma versão específica do SQLite, você pode incluir a biblioteca SQLite no pacote.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.

Vamos começar com como usar a versão do SQLite incluída no Windows.Let's start with how you use the version of SQLite that included with Windows.

Para usar a versão do SQLite instalada no WindowsTo use the version of SQLite that is installed with Windows

Escolha a guia Procurar, procure o pacote Microsoft.Data.SQLite.core e instale-o.Choose the Browse tab, and search for the Microsoft.Data.SQLite.core package, and then install it.

Pacote SQLite Core

Procure o pacote SQLitePCLRaw.bundle_winsqlite3 e instale-o somente no projeto UWP da solução.Search for the SQLitePCLRaw.bundle_winsqlite3 package, and then install it only to the UWP project in your solution.

Pacote SQLite PCL Raw

Para incluir o SQLite com o aplicativoTo include SQLite with your app

Você não precisa fazer isso.You don't have to do this. Mas, se você tiver um motivo para incluir uma versão específica do SQLite no aplicativo, escolha a guia Procurar e procure o pacote 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. Instale a versão 2.0 (ou inferior) do mesmo pacote.Install version 2.0 (or lower) of that package.

Captura de tela da caixa de diálogo Microsoft Data SQLite mostrando a versão 2.0.0 estável mais recente selecionada.

Adicionar e recuperar dados em um banco de dados do SQLiteAdd and retrieve data in a SQLite database

Vamos fazer o seguinte:We'll do these things:

1️⃣ Preparar a classe de acesso a dados.Prepare the data access class.

2️⃣ Inicializar o banco de dados SQLite.Initialize the SQLite database.

3️⃣ Inserir dados no banco de dados do SQLite.Insert data into the SQLite database.

4️⃣ Recuperar dados do banco de dados SQLite.Retrieve data from the SQLite database.

5️⃣ Adicionar uma interface do usuário básica.Add a basic user interface.

Preparar a classe de acesso a dadosPrepare the data access class

No projeto UWP, adicione uma referência ao projeto DataAccessLibrary na solução.From your UWP project, add a reference to the DataAccessLibrary project in your solution.

Biblioteca de classes de acesso a dados

Adicione a seguinte instrução using aos arquivos App.xaml.cs e MainPage.xaml.cs no projeto UWP.Add the following using statement to the App.xaml.cs and MainPage.xaml.cs files in your UWP project.

using DataAccessLibrary;

Abra a classe DataAccess na solução DataAccessLibrary e faça essa classe ficar estática.Open the DataAccess class in your DataAccessLibrary solution and make that class static.

Observação

Embora nosso exemplo coloque o código de acesso a dados em uma classe estática, isso é somente uma opção de design e é totalmente opcional.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
    {

    }
}

Adicione a instrução a seguir na parte superior deste arquivo.Add the following using statements to the top of this file.

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

Inicializar o banco de dados SQLiteInitialize the SQLite database

Adicione um método à classe DataAccess que inicialize o banco de dados SQLite.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();
    }
}

Este código cria o banco de dados SQLite e o armazena no armazenamento de dados local do aplicativo.This code creates the SQLite database and stores it in the application's local data store.

Neste exemplo, nomeamos o banco de dados sqlliteSample.db, mas você pode usar qualquer nome que desejar, desde que use esse nome em todos os objetos SqliteConnection em que criar uma instância.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.

No construtor do arquivo App.xaml.cs do projeto UWP, chame o método InitializeDatabase da 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();

}

Inserir dados no banco de dados do SQLiteInsert data into the SQLite database

Adicione um método à classe DataAccess que insira dados no banco de dados SQLite.Add a method to the DataAccess class that inserts data into the SQLite database. Este código usa parâmetros na consulta para evitar ataques de injeção do SQL.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();
    }

}

Recuperar dados do banco de dados SQLiteRetrieve data from the SQLite database

Adicione um método que obtenha linhas de dados de um banco de dados 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;
}

O método Leitura avança por linhas de dados retornados.The Read method advances through the rows of returned data. Ele retornará true se houver mais linhas restantes; caso contrário, retornará false.It returns true if there are rows left, otherwise it returns false.

O método GetString retorna o valor da coluna especificada como uma cadeia de caracteres.The GetString method returns the value of the specified column as a string. Ele aceita um valor inteiro que representa o ordinal da coluna baseada em zero dos dados que você deseja.It accepts an integer value that represents the zero-based column ordinal of the data that you want. Você pode usar métodos semelhantes, como GetDataTime e GetBoolean.You can use similar methods such as GetDataTime and GetBoolean. Escolha um método com base em qual tipo de dados a coluna contém.Choose a method based on what type of data the column contains.

O parâmetro ordinal não é tão importante neste exemplo porque estamos selecionando todas as entradas em uma única coluna.The ordinal parameter isn't as important in this example because we are selecting all of the entries in a single column. No entanto, se várias colunas fizerem parte da sua consulta, use o valor ordinal para obter a coluna da qual você deseja obter dados.However, if multiple columns are part of your query, use the ordinal value to obtain the column you want to pull data from.

Adicionar uma interface do usuário básicaAdd a basic user interface

No arquivo MainPage.xaml do projeto UWP, adicione o seguinte XAML.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>

Essa interface do usuário básica dá ao usuário um TextBox que pode ser usado para digitar uma cadeia de caracteres que adicionaremos ao banco de dados 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. Conectaremos o Button nessa interface do usuário a um manipulador de eventos que recuperará dados do banco de dados SQLite e, em seguida, mostrará esses dados no 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.

No arquivo MainPage.xaml.cs, adicione o seguinte manipulador.In the MainPage.xaml.cs file, add the following handler. Este é o método que associamos ao evento Click do Button na interface do usuário.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();
}

Isso é tudo.That's it. Explore o Microsoft.Data.Sqlite para ver o que mais você pode fazer com o banco de dados SQLite.Explore the Microsoft.Data.Sqlite to see what other things you can do with your SQLite database. Confira os links a seguir para saber mais sobre outras maneiras de usar dados em seu aplicativo UWP.Check out the links below to learn about other ways to use data in your UWP app.

Próximas etapasNext steps

Conectar seu aplicativo diretamente a um banco de dados do SQL ServerConnect your app directly to a SQL Server database

Veja Usar um banco de dados do SQL Server em um aplicativo UWP.See Use a SQL Server database in a UWP app.

Compartilhar código entre aplicativos diferentes em diferentes plataformasShare code between different apps across different platforms

Confira Compartilhar código entre a área de trabalho e a UWP.See Share code between desktop and UWP.

Adicionar páginas de detalhes mestre com back-ends do Azure SQLAdd master detail pages with Azure SQL back ends

Confira Exemplo de banco de dados de pedidos do cliente.See Customer Orders Database sample.