Usar una base de datos de SQLite en una aplicación para UWP
Puede 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.
Algunas ventajas de usar SQLite para el almacenamiento local
✔️ SQLite es ligero y independiente. Es una biblioteca de código sin ninguna otra dependencia. No hay nada que configurar.
✔️ No hay ningún servidor de bases de datos. El cliente y el servidor se ejecutan en el mismo proceso.
✔️ SQLite está en el dominio público para que pueda usar y distribuirlo libremente con la aplicación.
✔️ SQLite funciona en plataformas y arquitecturas.
Puede obtener más información sobre SQLite aquí.
Elección de 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 mapeador objeto-relacional que puede usar para trabajar con datos relacionales mediante objetos específicos del dominio. Si ya has usado este marco para trabajar con datos en otras aplicaciones .NET, puedes migrar ese código a una aplicación para UWP y funcionará con los cambios adecuados en la cadena de conexión.
Para probarlo, consulte Introducción a EF Core.
Biblioteca SQLite
La biblioteca Microsoft.Data.Sqlite implementa las interfaces en el espacio de nombres System.Data.Common. Microsoft mantiene activamente estas implementaciones y proporcionan un contenedor intuitivo en torno a la API de SQLite nativa de bajo nivel.
El resto de esta guía le ayuda a usar esta biblioteca.
Configuración de la solución para usar la biblioteca Microsoft.Data.SQlite
Comenzaremos con un proyecto de UWP básico y, a continuación, instalaremos los paquetes Nuget adecuados.
Nota
Asegúrate de instalar el Microsoft.Data.Sqlite' package and not 'Microsoft.Data.Sqlite.Core
. Este paquete instalará Microsoft.Data.Sqlite.Core
como dependencia.
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 ayuda de varias maneras.
✔️ Reduce el tamaño de la aplicación porque no tiene que descargar el archivo binario de SQLite y, a continuación, empaquetarlo como parte de la aplicación.
✔️ Impide que tenga que insertar una nueva versión de la aplicación a los usuarios en caso de que SQLite publique correcciones críticas en errores y vulnerabilidades de seguridad en 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 lo más probable es que la versión del SDK de SQLite ya se cargue en la memoria.
Comencemos agregando una clase al proyecto de UWP denominado DataAccess. Puede usar un proyecto de biblioteca de clases de .NET Standard para contener el código de acceso a datos, pero no usaremos uno en nuestro ejemplo.
Haga clic con el botón derecho en la solución y, a continuación, haga clic en Administrar paquetes NuGet para la solución.
En este momento, tienes una opció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.core y, luego, instale la versión estable más reciente.
del paquete SQLite Core
Adición y recuperación de 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.
Preparación de la clase de acceso a datos
Abra la clase DataAccess
en el proyecto y haga que esa clase sea estática.
Nota
Aunque nuestro ejemplo colocará el código de acceso a datos en una clase estática, es simplemente una opción de diseño y es completamente opcional.
public static class DataAccess
{
}
Agrega la siguiente instrucción using en la parte superior de este archivo.
using Microsoft.Data.Sqlite;
using System.Collections.Generic;
Inicialización de la base de datos de SQLite
Agregue un método a la clase DataAccess
que inicializa 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 (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 crea la base de datos de SQLite y la almacena en el almacén de datos local de la aplicación.
En este ejemplo, asignamos el nombre sqlliteSample.db
a la base de datos, pero puede usar el nombre que desee, siempre y cuando use ese nombre en todos los objetos SqliteConnection que instancie.
En el constructor del archivo App.xaml.cs del proyecto de UWP, llame al método InitializeDatabase
de la clase DataAccess
.
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
DataAccess.InitializeDatabase();
}
Insertar datos en la base de datos de SQLite
Agregue un método a la clase DataAccess
que inserta datos en la base de datos de SQLite. Este código usa parámetros en la consulta para evitar ataques por inyección de CÓDIGO SQL.
public static void AddData(string inputText)
{
string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
using (SqliteConnection db =
new SqliteConnection($"Filename={dbpath}"))
{
SQLitePCL.Batteries.Init();
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();
}
}
Recuperación de datos de la base de datos de SQLite
Agregue un método que obtenga filas de datos de una base de datos de SQLite.
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));
}
}
return entries;
}
El método Read avanza por las filas de datos devueltos. Devuelve true
si quedan filas; de lo contrario, devuelve false
.
El método GetString devuelve el valor de la columna especificada como una cadena. Acepta un valor entero que representa el ordinal de columna de base cero de los datos que desea. Puede usar métodos similares, como GetDataTime y GetBoolean. Elija un método basado en el tipo de datos que contiene la columna.
El parámetro ordinal no es tan importante en este ejemplo porque se seleccionan todas las entradas de una sola columna. Sin embargo, si varias columnas forman parte de la consulta, use el valor ordinal para obtener la columna de la que desea extraer datos.
Adición de una interfaz de usuario básica
En el archivo MainPage.xaml del proyecto de UWP, agrega el siguiente código 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>
Esta interfaz de usuario básica proporciona al usuario un TextBox
que puede usar para escribir una cadena que agregaremos a la base de datos de SQLite. Conectaremos el Button
de esta interfaz de usuario a un controlador de eventos que recuperará datos de la base de datos de SQLite y, a continuación, mostraremos esos datos en el ListView
.
En el archivo MainPage.xaml.cs, agregue el siguiente controlador. Este es el método asociado al evento Click
del 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 MainPage
para llamar a GetData()
.
public MainPage()
{
this.InitializeComponent();
Output.ItemsSource = DataAccess.GetData();
}
Eso es todo. Explore Microsoft.Data.Sqlite para ver qué otras cosas puedes hacer con tu base de datos de SQLite. Consulta los vínculos siguientes para obtener información sobre otras formas de usar datos en tu aplicación para UWP.
Pasos siguientes
Conexión de la aplicación directamente a una base de datos de SQL Server
Ver Usar base de datos de SQL Server en una aplicación para UWP.
Uso compartido de código entre diferentes aplicaciones en distintas plataformas
Consulta Compartir código entre una aplicación de escritorio y una aplicación para UWP.