Ejercicio: Almacenamiento de datos de forma local con SQLite
En este ejercicio, usará SQLite para almacenar información localmente con una aplicación. En el escenario de ejemplo, decidió almacenar en caché los datos de la aplicación de red social para mejorar la capacidad de respuesta. Este ejercicio crea y usa una base de datos SQLite local para almacenar la información de las personas. Guarde el archivo de base de datos físico en el almacenamiento local.
Este módulo usa el SDK de .NET 10.0. Asegúrese de que tiene instalado .NET 10.0 ejecutando el siguiente comando en el terminal de comandos preferido:
dotnet --list-sdks
Aparecerá un resultado similar al del ejemplo siguiente:
9.0.100 [C:\Program Files\dotnet\sdk]
10.0.100 [C:\Program Files\dotnet\sdk]
Asegúrese de que aparezca una versión que comience en 10. Si no aparece ninguno o no se encuentra el comando, instale el SDK de .NET 10.0 más reciente.
Apertura de la solución de inicio
Clone o descargue el repositorio del ejercicio.
Nota:
Es mejor clonar el contenido del ejercicio en una ruta de acceso de carpeta corta, como C:\dev, para evitar que los archivos generados por compilación excedan la longitud máxima de la ruta de acceso.
Use Visual Studio para abrir la solución People.sln, que encontrará en mslearn-dotnetmaui-store-local-data>Personas, o la carpeta starter en Visual Studio Code.
Nota:
No intente ejecutar la aplicación todavía, el código está incompleto y producirá excepciones hasta que agregue los elementos que faltan más adelante en este ejercicio.
Definición de una entidad SQLite
Abra el archivo Person.cs en la carpeta Modelos.
Agregue una propiedad
intdenominadaIda la clasePerson.Agregue una propiedad
stringdenominadaName. La clase debería tener el siguiente aspecto:namespace People.Models; public class Person { public int Id { get; set; } public string Name { get; set; } }Guarde el archivo Person.cs.
Adición de la biblioteca SQLite
Haga clic con el botón derecho en el nodo del proyecto People en el Explorador de soluciones de Visual Studio.
En el menú contextual que aparece, seleccione Administrar paquetes NuGet.
Busque y seleccione sqlite-net-pcl y, a continuación, seleccione Instalar.
Si usa Visual Studio Code, abra el terminal y estos paquetes con los siguientes comandos:
dotnet add package sqlite-net-pcl
Adición de atributos de SQLite
En el archivo Person.cs, agregue una directiva
usingpara el espacio de nombresSQLiteal archivo de la clasePerson. Esta directiva permite usar los atributos de SQLite.using SQLite; namespace People.Models; public class Person { ... }Anote la clase
Personcon el atributo[Table]y especifique que el nombre de la tabla espeople.Especifique la propiedad
Idcomo clave principal. Anótela con los atributos[PrimaryKey]y[AutoIncrement].Agregue anotaciones a la propiedad
Name. Especifique suMaxLengthcomo 250. Especifique que cada valor de la columna debe serUnique.Este es el aspecto que debería tener la clase completada:
using SQLite; namespace People.Models; [Table("people")] public class Person { [PrimaryKey, AutoIncrement] public int Id { get; set; } [MaxLength(250), Unique] public string Name { get; set; } }Guarde el archivo Person.cs.
Conectarse a la base de datos
Abra el archivo PersonRepository.cs.
Examine la clase
PersonRepository. Esta clase contiene código esqueleto incompleto conTODOmarcadores donde puedes agregar la funcionalidad para acceder a la base de datos.Agregue una directiva
usingpara los espacios de nombresSQLiteyPeople.Modelsal archivo de la clasePersonRepository.cs.Agregue un campo privado
SQLiteConnectiondenominadoconna la clase, encima de la funciónInit.En la función
Init, compruebe siconnno es igual anull. Si es así, ejecute "return" inmediatamente.if (conn != null) return;De esta forma, el código de inicialización de la base de datos SQLite solo se ejecuta una vez.
Inicialice el campo
connpara conectarse a la base de datos con la variable_dbPath.Use el método
conn.CreateTablepara crear una tabla para almacenar datosPerson. Este es el aspecto que debería tener la funciónInitcompletada:using SQLite; using People.Models; ... private SQLiteConnection conn; ... private void Init() { if (conn != null) return; conn = new SQLiteConnection(_dbPath); conn.CreateTable<Person>(); }
Inserción de una fila en la base de datos
En la clase
PersonRepository, busque el métodoAddNewPerson.Para insertar un nuevo objeto
Person, reemplace el comentarioTODOen este método por código. El código llama primero aInitpara comprobar que se inicializa la base de datos y, a continuación, usa el métodoSQLiteConnectiondel objetoInsert. Establezca la variableresulten el valor que devuelve el métodoInsert, como se muestra en el código siguiente:public void AddNewPerson(string name) { int result = 0; try { // enter this line Init(); // basic validation to ensure a name was entered if (string.IsNullOrEmpty(name)) throw new Exception("Valid name required"); // enter this line result = conn.Insert(new Person { Name = name }); ... } ... }
Recuperación de filas de la base de datos
En la clase
PersonRepository, busque el métodoGetAllPeople.Llame a
Initpara comprobar que se inicializa la base de datos.Use el método
Table\<T>genérico para recuperar todas las filas de la tabla. EspecifiquePersoncomo parámetro de tipo.Use el método de extensión
ToList()para convertir el resultado en una colecciónList\<Person>y devolver esta colección.Agregue control de errores encapsulando el código en un bloque
try-catch. Si se produce un error, establezca la propiedadStatusMessageen la propiedadMessagede la excepción y devuelva una colección vacía. El método completado debería tener el siguiente aspecto:public List<Person> GetAllPeople() { try { Init(); return conn.Table<Person>().ToList(); } catch (Exception ex) { StatusMessage = string.Format("Failed to retrieve data. {0}", ex.Message); } return new List<Person>(); }Guarde el archivo PersonRepository.cs.
Integración del repositorio en la interfaz de usuario
Abra el archivo MauiProgram.cs.
En la función
CreateMauiApp, después de las instrucciones que agregan la páginaMainPagecomo servicio singleton a la aplicación, agregue código para realizar las siguientes tareas:Crear una variable de cadena denominada
dbPath. Inicializar esta cadena con la expresiónFileAccessHelper.GetLocalFilePath("people.db3"). El archivo de base de datos que usa la aplicación se denomina people.db3, y la aplicación guarda este archivo en el almacenamiento local en el dispositivo.Usar la inserción de dependencias para agregar la clase
PersonRepositorycomo servicio singleton a la aplicación. La clasePersonRepositoryexpone un constructor que toma la ruta de acceso al archivo de base de datos como un parámetro de cadena.
El código completado de la función
CreateMauiAppdebería tener el siguiente aspecto:public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }); // Add this code string dbPath = FileAccessHelper.GetLocalFilePath("people.db3"); builder.Services.AddSingleton<PersonRepository>(s => ActivatorUtilities.CreateInstance<PersonRepository>(s, dbPath)); return builder.Build(); }Guarde el archivo MauiProgram.cs.
Expanda App.xaml en el Explorador de soluciones y abra el archivo App.xaml.cs.
Agregue una propiedad
public,staticllamadaPersonRepo. Esta propiedad contiene un objetoPersonRepositoryde la claseApp.Inicialice la propiedad
PersonRepoen el constructor agregando un parámetroPersonRepositoryal constructor y estableciendo la propiedad 'PersonRepo' en el valor de este parámetro. Este es el aspecto que debería tener la claseAppcompletada:public partial class App : Application { public static PersonRepository PersonRepo { get; private set; } public App(PersonRepository repo) { InitializeComponent(); PersonRepo = repo; } }
Nota:
El proceso de inserción de dependencias rellena automáticamente el parámetro repo en el constructor.
Prueba de la aplicación
Compile la solución mediante CTRL+Mayús+B.
Una vez completada la compilación, inicie la depuración mediante F5. Cuando aparezca la interfaz de usuario, escriba su nombre y seleccione Agregar persona.
Seleccione Obtener todas las personas y compruebe que aparezca su nombre.
Experimente agregando más nombres y recuperando la lista de personas almacenadas.
Vuelva a Visual Studio o Visual Studio Code y detenga la depuración mediante Mayús+F5.
Reinicie la aplicación y seleccione Obtener todas las personas. Compruebe que los nombres almacenados anteriormente todavía estén almacenados en la base de datos. Cierre la aplicación cuando haya terminado.