Tutorial: Usar uma base de dados SQLite numa aplicação Windows

SQLite fornece uma solução de base de dados fiável e leve para armazenar dados localmente em Windows aplicações. Ao contrário dos sistemas de banco de dados tradicionais que exigem instalações de servidor separadas e configurações complexas, o SQLite é executado inteiramente dentro do processo do aplicativo e armazena dados em um único arquivo no dispositivo do usuário.

Este tutorial mostra como integrar o SQLite em seu aplicativo WinUI usando as bibliotecas de acesso a dados recomendadas da Microsoft. Você aprenderá a configurar um banco de dados, criar tabelas e implementar operações básicas de dados, tudo isso seguindo as práticas recomendadas de segurança para se proteger contra vulnerabilidades comuns.

O que você vai realizar

Neste tutorial, você aprenderá a:

  • Configure a sua aplicação para Windows usar SQLite com a biblioteca Microsoft.Data.SQLite
  • Criar e inicializar um banco de dados local
  • Implementar métodos seguros de inserção e recuperação de dados
  • Crie uma interface de usuário simples para interagir com seus dados

Pré-requisitos

Para concluir este tutorial, você precisa:

  • Visual Studio 2026 ou posterior com carga de desenvolvimento de aplicações WinUI
  • Familiaridade básica com C# e XAML
  • Compreensão dos conceitos fundamentais de bases de dados

Principais melhorias que esta abordagem oferece

Usar SQLite para armazenamento local de dados na sua aplicação Windows oferece várias vantagens:

  • Implantação simplificada: não é necessária uma instalação separada do servidor de banco de dados
  • Segurança melhorada: os dados permanecem locais no dispositivo do utilizador
  • Melhor desempenho: o acesso direto a arquivos elimina a latência da rede
  • Complexidade reduzida: o banco de dados de arquivo único simplifica o backup e a migração

As técnicas que vais aprender aplicam-se a qualquer aplicação Windows que precise de armazenar dados estruturados localmente, desde armazenamento simples de definições até cenários complexos de gestão de dados.

Sugestão

Você pode usar a assistência de IA para ajudar a evitar ataques de injeção de SQL no SQLite.

Benefícios do SQLite para armazenamento local

✔️ SQLite é leve e independente. É uma biblioteca de códigos sem outras dependências. Não há nada para configurar.

✔️ Não há servidor de banco de dados. O cliente e o servidor são executados no mesmo processo.

✔️ SQLite está no domínio público para que você possa usá-lo e distribuí-lo livremente com seu aplicativo.

✔️ O SQLite funciona em várias plataformas e arquiteturas.

Você pode ler mais sobre SQLite aqui.

Escolha uma camada de abstração

Recomendamos que utilize o Entity Framework Core ou a biblioteca open-source SQLite construída pela Microsoft.

Entity Framework Core

O Entity Framework (EF) é um mapeador objeto-relacional que você pode usar para trabalhar com dados relacionais usando objetos específicos do domínio. Se já usaste este framework para trabalhar com dados noutras aplicações .NET, podes usar o mesmo código na tua app WinUI e ele funcionará com as alterações apropriadas na connection string.

Para experimentar, consulte Introdução ao EF Core.

Biblioteca SQLite

A biblioteca Microsoft.Data.Sqlite implementa as interfaces no espaço de nomes System.Data.Common. A Microsoft mantém ativamente essas implementações e elas fornecem um wrapper intuitivo em torno da API SQLite nativa de baixo nível.

O resto deste guia ajuda-o a utilizar esta biblioteca.

Configurar sua solução para usar a biblioteca Microsoft.Data.SQLite

Começaremos com um projeto WinUI básico e, em seguida, instalaremos o pacote NuGet SQLite. Consulte Criar um aplicativo WinUI para obter instruções sobre como criar seu primeiro projeto WinUI.

Todas as versões suportadas do Windows suportam SQLite, por isso a tua aplicação não tem de empacotar bibliotecas SQLite. Em vez disso, a sua aplicação pode usar a versão do SQLite que vem instalada com o Windows. Isto ajuda-o de algumas formas.

✔️ Reduz o tamanho do seu aplicativo porque você não precisa baixar o binário SQLite e, em seguida, empacotá-lo como parte do seu aplicativo.

✔️ Evita que você tenha que enviar uma nova versão do seu aplicativo para os usuários caso o SQLite publique correções críticas para bugs e vulnerabilidades de segurança no SQLite. A versão Windows do SQLite é mantida pela Microsoft em coordenação com a SQLite.org.

✔️ O tempo de carregamento do aplicativo tem o potencial de ser mais rápido porque, muito provavelmente, a versão SDK do SQLite já será carregada na memória.

Vamos começar adicionando uma classe ao seu projeto chamada DataAccess. Se planeia partilhar a lógica de acesso a dados com outro código cliente, pode usar um projeto de biblioteca de classes .NET para conter o seu código de acesso aos dados, mas não usaremos um no nosso exemplo.

  1. Clique com o botão direito do mouse na solução e clique em Gerenciar Pacotes NuGet para Solução.

    Uma captura de ecrã do Solution Explorer do Visual Studio com o projeto clicado com o botão direito e a opção Gerenciar Pacotes NuGet destacada.

    Neste ponto, você tem uma escolha. Podes usar a versão do SQLite que vem incluída no Windows ou, se tiveres algum motivo para usar uma versão específica do SQLite, podes incluir a biblioteca SQLite no teu pacote. Vamos usar a versão do SQLite que está incluída no Windows.

  2. Escolha a guia Procurar , procure o pacote Microsoft.Data.SQLite e instale a versão estável mais recente.

    SQLite Pacote NuGet

Adicionar e recuperar dados em um banco de dados SQLite

Faremos o seguinte:

1️⃣ Preparar a classe de acesso aos dados.

2️⃣ Inicialize o banco de dados SQLite.

3️⃣ Insira dados no banco de dados SQLite.

4️⃣ Recuperar dados do banco de dados SQLite.

5️⃣ Adicione uma interface de usuário básica.

Preparar a classe de acesso a dados

Abra a DataAccess classe em seu projeto e torne essa classe estática.

Observação

Embora o exemplo coloque seu código de acesso a dados em uma classe estática, essa é uma escolha de design e é completamente opcional.

public static class DataAccess
{
}

Adicione as seguintes using declarações no topo deste ficheiro.

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

Inicializar o banco de dados SQLite

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

Observação

O código acima que usa ApplicationData membros só funcionará para aplicações empacotadas a serem executadas num contêiner de aplicativo. Todas as outras aplicações Windows devem aceder aos membros ApplicationData através da classe ApplicationDataManager.

Esse código cria o banco de dados SQLite e o armazena no armazenamento de dados local do aplicativo.

Neste exemplo, nomeamos o banco de dados sqlliteSample.db , mas você pode usar o nome que quiser, desde que use esse nome em todos os objetos SqliteConnection que você instanciar. Numa aplicação de produção, a informação de ligação, como o nome do ficheiro da base de dados, deve ser armazenada na configuração da aplicação em vez de codificada diretamente (ver Adicionar Azure App Configuration usando Visual Studio Connected Services).

No construtor do arquivo App.xaml.cs do seu projeto, chame o método InitializeDatabaseDataAccess da classe. Isso garantirá que o banco de dados seja criado ou aberto sempre que o aplicativo for iniciado.

public App()
{
    this.InitializeComponent();

    DataAccess.InitializeDatabase();
}

Inserir dados no banco de dados SQLite

Adicione um método à DataAccess classe que insere dados no banco de dados SQLite. Esse código usa parâmetros na consulta para evitar ataques de injeção de 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();
    }

}

Recuperar dados do banco de dados SQLite

Adicione um método que obtém todas as linhas de dados de uma tabela em nosso banco de dados 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;
}

O método Read avança pelas linhas de dados retornados. Ele retorna true se houver linhas restantes, caso contrário, ele retorna false.

O método GetString retorna o valor da coluna especificada como uma cadeia de caracteres. Ele aceita um valor inteiro que representa o ordinal de coluna baseado em zero dos dados desejados. Você pode usar métodos semelhantes, como GetDataTime e GetBoolean. Escolha um método com base no tipo de dados que a coluna contém.

O parâmetro ordinal não é tão importante neste exemplo porque estamos selecionando todas as entradas em uma única coluna. No entanto, se várias colunas fizerem parte da consulta, use o valor ordinal para obter a coluna da qual você deseja extrair dados.

Adicionar uma interface de usuário básica

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

Essa interface de usuário básica fornece ao usuário um TextBox que ele pode usar para digitar uma cadeia de caracteres que adicionaremos ao banco de dados SQLite. Conectaremos o Button nesta interface do usuário a um manipulador de eventos que recuperará dados do banco de dados SQLite e, em seguida, mostraremos esses dados no ListView.

No arquivo MainWindow.xaml.cs , adicione o seguinte manipulador. Este é o método que associamos ao evento Click do Button na interface de utilizador.

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

    Output.ItemsSource = DataAccess.GetData();
}

Também queremos ter certeza de que todos os dados existentes serão carregados quando o aplicativo for iniciado. Adicione uma linha de código ao MainWindow construtor para chamar GetData().

public MainWindow()
{
    this.InitializeComponent();

    Output.ItemsSource = DataAccess.GetData();
}

É isso. Explore o Microsoft.Data.Sqlite para ver o que outras coisas você pode fazer com seu banco de dados SQLite. Consulte os links abaixo para saber sobre outras formas de usar dados nas suas aplicações Windows.

Evite ataques de injeção de SQL

O código neste exemplo usa consultas parametrizadas para evitar ataques de injeção de SQL. Nunca concatene a entrada do usuário em uma cadeia de caracteres de consulta SQL. Use sempre parâmetros. Pode pedir ao Copilot mais dicas para evitar ataques de injeção SQL.

O texto seguinte mostra um exemplo de prompt para o Copilot:

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

O Copilot é alimentado por IA, por isso surpresas e erros são possíveis. Para mais informações, consulte Copilot FAQs.

Ligue a sua aplicação diretamente a uma base de dados do SQL Server

Veja Utilizar uma base de dados SQL Server numa aplicação Windows.

Partilhe código entre diferentes aplicações em diferentes plataformas

Veja Partilhar código entre ambiente de trabalho e UWP.

Adicionar páginas de detalhe mestre com backends Azure SQL

Consulte exemplo da Base de Dados de Encomendas de Clientes.