Compartir a través de


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.

Otra captura de pantalla del panel del Explorador de Soluciones con el proyecto seleccionado con el botón derecho y la opción Administrar paquetes NuGet resaltada.

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.

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

Consulta Ejemplo de base de datos de pedidos de clientes.