Adición de la sincronización de datos sin conexión a la aplicación MAUI de .NET
Nota
Este producto se retira. Para obtener un reemplazo de proyectos con .NET 8 o posterior, consulte la biblioteca datasync de Community Toolkit.
En este tutorial se describe la característica de sincronización sin conexión de Azure Mobile Apps para .NET MAUI. La sincronización sin conexión permite a los usuarios finales interactuar con una aplicación móvil incluso cuando no hay ninguna conexión de red. Los cambios se almacenan en una base de datos local. Una vez que el dispositivo vuelve a estar en línea, estos cambios se sincronizan con el back-end remoto.
Antes de comenzar este tutorial, debe haber completado el tutorial de inicio rápido de .NET MAUI , que incluye la creación de un servicio back-end adecuado.
Para más información sobre la característica de sincronización sin conexión, consulte el tema Sincronización de datos sin conexión en Azure Mobile Apps.
Actualización de la aplicación para admitir la sincronización sin conexión
En la operación en línea, leerá y escribirá desde un IRemoteTable<T>
. Al usar la sincronización sin conexión, lee y escribe desde un IOfflineTable<T>
en su lugar. El IOfflineTable
está respaldado por una base de datos SQLite en el dispositivo y sincronizada con la base de datos back-end.
En Visual Studio:
Haga clic con el botón derecho en la solución
TodoApp
y seleccione Administrar paquetes NuGet para la solución....En la nueva pestaña, seleccione Examinary escriba Microsoft.Datasync.Client en el cuadro de búsqueda.
Seleccione el paquete
Microsoft.Datasync.Client.SQLiteStore
.En el panel derecho, seleccione todos los proyectos de cliente (excepto el proyecto de
TodoAppService.NET6
).Seleccione Instalar.
Acepte el contrato de licencia cuando se le solicite.
Actualización del cliente de servicio remoto
Abra el proyecto de TodoApp.Data
y busque la clase RemoteTodoService.cs
(en el directorio Services
). Actualice la clase de la siguiente manera:
Agregue la siguiente instrucción
using
en la parte superior del archivo:using Microsoft.Datasync.Client.SQLiteStore;
Cambie la definición de
_table
para que sea unaIOfflineTable<TodoItem>
:/// <summary> /// Reference to the table used for datasync operations. /// </summary> private IOfflineTable<TodoItem> _table = null;
Agregue una nueva propiedad para almacenar la ubicación de la base de datos sin conexión:
/// <summary> /// The path to the offline database /// </summary> public string OfflineDb { get; set; }
Actualice el método
InitializeAsync
para definir la base de datos sin conexión:// Create the offline store definition var connectionString = new UriBuilder { Scheme = "file", Path = OfflineDb, Query = "?mode=rwc" }.Uri.ToString(); var store = new OfflineSQLiteStore(connectionString); store.DefineTable<TodoItem>(); var options = new DatasyncClientOptions { OfflineStore = store, HttpPipeline = new HttpMessageHandler[] { new LoggingHandler() } }; // Create the datasync client. _client = TokenRequestor == null ? new DatasyncClient(Constants.ServiceUri, options) : new DatasyncClient(Constants.ServiceUri, new GenericAuthenticationProvider(TokenRequestor), options); // Initialize the database await _client.InitializeOfflineStoreAsync(); // Get a reference to the offline table. _table = _client.GetOfflineTable<TodoItem>(); // Set _initialized to true to prevent duplication of locking. _initialized = true;
Actualice el
RefreshItemsAsync()
para realizar la sincronización sin conexión:/// <summary> /// Refreshes the TodoItems list manually. /// </summary> /// <returns>A task that completes when the refresh is done.</returns> public async Task RefreshItemsAsync() { await InitializeAsync(); // First, push all the items in the table. await _table.PushItemsAsync(); // Then, pull all the items in the table. await _table.PullItemsAsync(); return; }
Establecimiento de la ubicación de la base de datos sin conexión
En el proyecto TodoApp.MAUI
, edite el archivo MainPage.xaml.cs
. Cambie la definición del RemoteTodoService
de la manera siguiente:
TodoService = new RemoteTodoService(GetAuthenticationToken)
{
OfflineDb = FileSystem.CacheDirectory + "/offline.db"
};
Si no ha completado el tutorial de autenticación de , la definición debería tener este aspecto en su lugar:
TodoService = new RemoteTodoService()
{
OfflineDb = FileSystem.CacheDirectory + "/offline.db"
};
Prueba de la aplicación
La aplicación no se sincroniza con el back-end hasta que se presiona el icono de actualización. Para probar:
Abra el
Azure Portal. Abra el grupo de recursos que contiene los recursos del inicio rápido.
Seleccione la base de datos
quickstart
.Seleccione el editor de consultas de (versión preliminar).
Inicie sesión con la autenticación de SQL Server con las mismas credenciales que configuró para la base de datos.
- Si es necesario, se le pedirá que permita el acceso a la dirección IP. Seleccione el vínculo para actualizar la lista de permitidos y presione Aceptar para reintentar el inicio de sesión.
En el editor de consultas, escriba
SELECT * FROM [dbo].[TodoItems]
. A continuación, seleccione Ejecutar.
Se mostrará una lista de todoItems actuales.
Ahora, realice algunos cambios a través de la aplicación. NO PRESIONE ACTUALIZAR (todavía).
Repita la instrucción SQL en Azure Portal y compruebe que no se han realizado cambios en los datos de la base de datos.
Seleccione el icono actualizar
Repita la instrucción SQL en Azure Portal y compruebe que los cambios se han insertado en el servicio remoto.
Limpieza de recursos
A menos que realice otro tutorial de inicio rápido, puede eliminar los recursos asociados al servicio back-end ahora.
- Abra el
Azure Portal. - Seleccione el grupo de recursos que contiene los recursos de inicio rápido.
- Seleccione Eliminar grupo de recursos.
- Siga las instrucciones para confirmar la eliminación.
También puede usar la CLI de Azure:
az group delete -g quickstart
Si usó la CLI para desarrolladores de Azure para implementar recursos, puede usar el comando azd down
en su lugar.
La eliminación tardará unos minutos en completarse.
Pasos siguientes
- Revise la documentación de PROCEDIMIENTOS: