Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
SQLite proporciona una solución de base de datos confiable y ligera para almacenar datos localmente en aplicaciones de Windows. A diferencia de los sistemas de base de datos tradicionales que requieren instalaciones de servidor independientes y configuraciones complejas, SQLite se ejecuta completamente dentro del proceso de aplicación y almacena datos en un único archivo en el dispositivo del usuario.
En este tutorial se muestra cómo integrar SQLite en la aplicación WinUI mediante las bibliotecas de acceso a datos recomendadas de Microsoft. Aprenderá a configurar una base de datos, crear tablas e implementar operaciones de datos básicas, mientras sigue los procedimientos recomendados de seguridad para protegerse frente a vulnerabilidades comunes.
Lo que conseguirás
En este tutorial, aprenderá a:
- Configuración de la aplicación Windows para usar SQLite con la biblioteca Microsoft.Data.SQLite
- Creación e inicialización de una base de datos local
- Implementación de métodos de inserción y recuperación de datos seguros
- Creación de una interfaz de usuario sencilla para interactuar con los datos
Prerrequisitos
Para completar este tutorial, necesita lo siguiente:
- Visual Studio 2022 o posterior con WinUI application development workload
- Conocimientos básicos de C# y XAML
- Descripción de los conceptos fundamentales de la base de datos
Mejoras clave que ofrece este enfoque
El uso de SQLite para el almacenamiento de datos local en la aplicación Windows ofrece varias ventajas:
- Implementación simplificada: no se requiere ninguna instalación independiente del servidor de bases de datos
- Seguridad mejorada: los datos permanecen locales en el dispositivo del usuario
- Rendimiento mejorado: el acceso directo a archivos elimina la latencia de red.
- Complejidad reducida: la base de datos de un solo archivo simplifica la copia de seguridad y la migración.
Las técnicas que aprenderá se aplican a cualquier aplicación de Windows que necesite almacenar datos estructurados localmente, desde el almacenamiento de configuración simple hasta escenarios complejos de administración de datos.
Sugerencia
Puede usar la asistencia de IA para ayudar a evitar ataques por inyección de código SQL en SQLite.
Ventajas de SQLite para el almacenamiento local
✔️ SQLite es ligero e independiente. Se trata de una biblioteca de código sin ninguna otra dependencia. No hay que configurar nada.
✔️ No hay ningún servidor de base de datos. El cliente y el servidor se ejecutan en el mismo proceso.
✔️ SQLite es de dominio público, por lo que puede utilizarlo y distribuirlo libremente con la aplicación.
✔️ SQLite funciona en diversas plataformas y arquitecturas.
Puedes leer más sobre SQLite aquí.
Elegir una capa de abstracción
Se recomienda usar Entity Framework Core o la biblioteca de código abierto SQLite compilada por Microsoft.
Entity Framework Core
Entity Framework (EF) es un asignador relacional de objetos que puedes usar para trabajar con datos relacionales mediante el uso de objetos específicos del dominio. Si ya ha usado este marco para trabajar con datos en otras aplicaciones de .NET, puede usar el mismo código en la aplicación WinUI y funcionará con los cambios adecuados en la connection string.
Para probarlo, consulte Introducción a EF Core.
Biblioteca de SQLite
La biblioteca Microsoft.Data.Sqlite implementa las interfaces en el espacio de nombres System.Data.Common. Microsoft mantiene estas implementaciones de forma activa y ofrece un contenedor intuitivo en torno a la API de SQLite nativa de bajo nivel.
El resto de esta guía te ayudará a usar esta biblioteca.
Configuración de la solución para usar la biblioteca Microsoft.Data.SQLite
Comenzaremos con un proyecto de WinUI básico y, a continuación, instalaremos el paquete NuGet de SQLite. Consulte Creación de una aplicación WinUI para obtener instrucciones sobre cómo crear su primer proyecto de WinUI.
Todas las versiones compatibles de Windows admiten SQLite, por lo que la aplicación no tiene que empaquetar bibliotecas de SQLite. En su lugar, la aplicación puede usar la versión de SQLite que viene instalada con Windows. Esto te ayudará de varias maneras.
✔️ Reduce el tamaño de la aplicación porque no tiene que descargar el archivo binario de SQLite y luego empaquetarlo como parte de la aplicación.
✔️ Evita que tenga que enviar una nueva versión de la aplicación a los usuarios en caso de que SQLite publique correcciones críticas para errores y vulnerabilidades de seguridad de SQLite. Microsoft mantiene la versión Windows de SQLite en coordinación con SQLite.org.
✔️ El tiempo de carga de la aplicación tiene el potencial de ser más rápido porque, muy probablemente, la versión del SDK de SQLite ya estará cargada en la memoria.
Para comenzar, agreguemos una clase al proyecto denominado DataAccess. Si tiene previsto compartir la lógica de acceso a datos con otro código de cliente, puede usar un proyecto de biblioteca de clases de .NET para contener el código de acceso a datos, pero no usaremos uno en nuestro ejemplo.
Haz clic con el botón derecho en la solución y luego haz clic en Administrar paquetes NuGet para la solución.
Captura de pantalla del Explorador de Soluciones de Visual Studio con el proyecto seleccionado haciendo clic con el botón derecho y la opción Administrar paquetes NuGet resaltada.
En este punto, tienes que realizar una elección. Puede usar la versión de SQLite que se incluye con Windows o si tiene algún motivo para usar una versión específica de SQLite, puede incluir la biblioteca SQLite en el paquete. Vamos a usar la versión de SQLite que se incluye con Windows.
Elija la pestaña Examinar, busque el paquete Microsoft.Data.SQLite y, luego, instale la versión estable más reciente.
Agregar y recuperar datos en una base de datos de SQLite
Haremos lo siguiente:
1️⃣ Preparar la clase de acceso a datos.
2️⃣ Inicializar la base de datos de SQLite.
3️⃣ Insertar datos en la base de datos de SQLite.
4️⃣ Recuperar datos de la base de datos de SQLite.
5️⃣ Agregar una interfaz de usuario básica.
Preparar la clase de acceso a datos
Abra la clase DataAccess en el proyecto y convierta esa clase en estática.
Nota
Aunque en el ejemplo se colocará el código de acceso a datos en una clase estática, se trata de una opción de diseño y es completamente opcional.
public static class DataAccess
{
}
Agrega las siguientes declaraciones using en la parte superior de este archivo.
using Microsoft.Data.Sqlite;
using System.Collections.Generic;
Inicializar la base de datos de SQLite
Agrega un método a la clase DataAccess que inicialice la base de datos de 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();
}
}
Nota
El código anterior que usa miembros ApplicationData solo funcionará para aplicaciones empaquetadas que se ejecutan en un contenedor de aplicaciones. Todas las demás aplicaciones Windows deben acceder a ApplicationData miembros a través de la clase ApplicationDataManager.
Este código crea la base de datos de SQLite y la almacena en el almacén de datos local de la aplicación.
En este ejemplo asignaremos a la base de datos el nombre sqlliteSample.db, pero puedes usar el nombre que quieras siempre que emplees dicho nombre en todos los objetos SqliteConnection de los que crees una instancia. En una aplicación de producción, la información de conexión, como el nombre de archivo de base de datos, debe almacenarse en la configuración de la aplicación en lugar de codificar de forma rígida (consulte Agregar Azure App Configuration mediante Visual Studio Connected Services).
En el constructor del archivo App.xaml.cs del proyecto, llame al método InitializeDatabase de la clase DataAccess. Esto garantizará que la base de datos se cree o se abra cada vez que se inicie la aplicación.
public App()
{
this.InitializeComponent();
DataAccess.InitializeDatabase();
}
Insertar datos en la base de datos de SQLite
Agrega un método a la clase DataAccess que inserte datos en la base de datos de SQLite. Este código utiliza parámetros en la consulta para evitar ataques de inserción 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 datos de la base de datos de SQLite
Agregue un método que obtenga todas las filas de datos de una tabla de 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;
}
El método Read avanza por las filas de datos devueltos. Devuelve true si hay filas restantes; de lo contrario, devuelve false.
El método GetString devuelve el valor de la columna especificada como cadena. Acepta un valor entero que representa el índice de columna comenzando desde cero de los datos deseados. Puedes usar métodos similares tales como GetDataTime y GetBoolean. Elige un método basado en el tipo de datos que contenga la columna.
El parámetro "ordinal" no es tan importante en este ejemplo porque vamos a seleccionar todas las entradas de una sola columna. Sin embargo, si hay varias columnas que formen parte de la consulta, usa el valor ordinal para obtener la columna de la que quieras extraer datos.
Agregar una interfaz de usuario básica
En el archivo MainWindows.xaml del proyecto, agregue el siguiente código 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>
Esta interfaz de usuario básica proporciona al usuario un elemento TextBox que puede usar para escribir una cadena que agregaremos a la base de datos de SQLite. Conectaremos el elemento Button de esta interfaz de usuario a un controlador de eventos que recuperará datos de la base de datos de SQLite y luego los mostrará en el control ListView.
En el archivo MainWindow.xaml.cs, agregue el siguiente controlador. Se trata del método que hemos asociado al evento Click de Button en la interfaz de usuario.
private void AddData(object sender, RoutedEventArgs e)
{
DataAccess.AddData(Input_Box.Text);
Output.ItemsSource = DataAccess.GetData();
}
También queremos asegurarnos de que los datos existentes se cargan cuando se inicia la aplicación. Agregue una línea de código al constructor MainWindow para llamar a GetData().
public MainWindow()
{
this.InitializeComponent();
Output.ItemsSource = DataAccess.GetData();
}
Eso es todo. Explora Microsoft.Data.Sqlite para ver otras cosas que puedes hacer con tu base de datos de SQLite. Consulte los vínculos siguientes para obtener información sobre otras formas de usar datos en las aplicaciones de Windows.
Evitar ataques por inyección de código SQL
El código de este ejemplo usa consultas con parámetros para evitar ataques por inyección de CÓDIGO SQL. Nunca concatene la entrada del usuario en una cadena de consulta SQL. Use siempre parámetros. Puede preguntar a Copilot por más consejos para evitar ataques de inyección de SQL.
En el siguiente texto se muestra un ejemplo de solicitud de Copilot:
Can you provide some best practices to avoid SQL injection attacks when writing SQLite queries in C# code?
Copilot funciona con inteligencia artificial, por lo que son posibles sorpresas y errores. Para obtener más información, vea Copilot preguntas más frecuentes.
Contenido relacionado
Conexión directa de la aplicación a una base de datos de SQL Server
Consulte Utilice una base de datos de SQL Server en una aplicación de Windows.
Compartir código entre diferentes aplicaciones de distintas plataformas
Consulta Compartir código entre una aplicación de escritorio y una aplicación para UWP.