Uso de una base de datos de SQLite en una aplicación de Windows
Puedes usar SQLite para almacenar y recuperar datos en una base de datos ligera en el dispositivo del usuario. En esta guía se muestra cómo hacerlo en las aplicaciones de SDK de Windows App.
Algunas ventajas de usar 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
Le recomendamos que use Entity Framework Core o la biblioteca de SQLite de código abierto que ha creado 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 de otras aplicaciones .NET, puede usar el mismo código en la aplicación de SDK de Windows App y funcionará con los cambios adecuados en la cadena de conexión.
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.
Configurar la solución para que utilice la biblioteca Microsoft.Data.SQlite
Comenzaremos con un proyecto básico de SDK de Windows App y, a continuación, instalaremos el paquete NuGet de SQLite.
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 de 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.
En este punto, tienes que realizar una elección. Puedes usar la versión de SQLite que se incluye con Windows o, si tienes algún motivo para usar una versión específica de SQLite, puedes incluir la biblioteca de 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 nuestro ejemplo colocará el código de acceso a datos en una clase estática, se trata de una posibilidad de diseño totalmente opcional.
public static class DataAccess
{
}
Agrega las siguientes instrucciones 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 de Windows deben tener acceso a los miembros ApplicationData
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 la base de datos, debe almacenarse en la configuración de la aplicación en lugar de codificarse de forma rígida (consulte Agregar Azure App Configuration mediante servicios conectados de Visual Studio).
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 a la izquierda y, si no, devuelve false
.
El método GetString devuelve el valor de la columna especificada como cadena. Este método acepta un valor entero que representa el índice de columna de base cero de los datos que quieres. 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 conocer otras formas de usar datos en la aplicación de Windows.
Contenido relacionado
Conectar tu aplicación directamente a una base de datos de SQL Server
Consulte Uso de 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.