Compartir a través de


Usar una base de datos de SQLite en una aplicación para UWP

Puedes usar SQLite para almacenar y recuperar datos en una base de datos ligera en el dispositivo del usuario. Esta guía te muestra cómo hacerlo.

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

Te recomendamos que uses 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 has usado este marco para trabajar con datos de 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 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

Empezaremos con un proyecto de UWP básico y luego instalaremos los paquetes NuGet adecuados.

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 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.

Haz clic con el botón derecho en la solución y luego haz clic en Administrar paquetes NuGet para la solución.

Otra captura de pantalla del panel Explorador de soluciones con el proyecto en el que se hizo clic con el botón derecho y la opción Administrar paquetes NuGet resaltada.

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.core y, luego, instale la versión estable más reciente.

Paquete de SQLite Core

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 tan solo de una posibilidad de diseño totalmente 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;

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 (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 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 el constructor del archivo App.xaml.cs del proyecto de UWP, llama 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

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 (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();
    }

}

Recuperar datos de la base de datos de SQLite

Agrega 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 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 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 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 MainPage.xaml.cs, agrega 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 MainPage para llamar a GetData().

public MainPage()
{
    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. Consulta los vínculos siguientes para conocer otras formas de usar datos en tu aplicación para UWP.

Pasos siguientes

Conectar tu aplicación directamente a una base de datos de SQL Server

Consulta Usar una base de datos de SQL Server en una aplicación para UWP.

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.

Agregar páginas de detalles maestras con servidores back-end de Azure SQL

Consulta Ejemplo de base de datos de pedidos de clientes.