Aggiungere la sincronizzazione dei dati offline all'app Xamarin.iOS

Questa esercitazione illustra la funzionalità di sincronizzazione offline di App per dispositivi mobili di Azure per Xamarin.iOS. La sincronizzazione offline consente agli utenti finali di interagire con un'app per dispositivi mobili, visualizzando, aggiungendo o modificando i dati, anche quando non è presente alcuna connessione di rete. Le modifiche vengono archiviate in un database locale. Quando il dispositivo torna online, vengono sincronizzate con il back-end remoto.

Prima di iniziare questa esercitazione, è necessario aver completato l'esercitazione introduttiva di Xamarin.iOS, che include la creazione di un servizio back-end appropriato.

Per altre informazioni sulla funzionalità di sincronizzazione offline, vedere l'argomento Sincronizzazione di dati offline nelle app per dispositivi mobili di Azure.

Aggiornare l'app per supportare la sincronizzazione offline

Nell'operazione online si legge e si scrive da un oggetto IRemoteTable<T>. Quando si usa la sincronizzazione offline, è invece possibile leggere e scrivere da un oggetto IOfflineTable<T> . è IOfflineTable supportato da un database SQLite sul dispositivo e sincronizzato con il database back-end.

In Visual Studio:

  1. Fare clic con il pulsante destro del mouse sulla TodoApp soluzione, quindi scegliere Gestisci pacchetti NuGet per la soluzione.

  2. Nella nuova scheda selezionare Sfoglia, quindi immettere Microsoft.Datasync.Client nella casella di ricerca.

    Screenshot of adding the offline NuGet in Visual Studio.

  3. Selezionare il Microsoft.Datasync.Client.SQLiteStore pacchetto.

  4. Nel riquadro di destra selezionare tutti i progetti client (ad eccezione del TodoAppService.NET6 progetto).

  5. Selezionare Installa.

  6. Accettare il contratto di licenza quando richiesto.

Aggiornare il client del servizio remoto

Aprire il TodoApp.Data progetto e individuare la RemoteTodoService.cs classe (all'interno della Services directory). Aggiornare la classe come segue:

  1. Aggiungere la seguente istruzione using all'inizio del file:

    using Microsoft.Datasync.Client.SQLiteStore;
    
  2. Modificare la definizione di _table come :IOfflineTable<TodoItem>

    /// <summary>
    /// Reference to the table used for datasync operations.
    /// </summary>
    private IOfflineTable<TodoItem> _table = null;
    
  3. Aggiungere una nuova proprietà per archiviare il percorso del database offline:

    /// <summary>
    /// The path to the offline database
    /// </summary>
    public string OfflineDb { get; set; }
    
  4. Aggiornare il InitializeAsync metodo per definire il database offline:

    // 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;
    
  5. Aggiornare per eseguire la RefreshItemsAsync() sincronizzazione offline:

    /// <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;
    }
    

Impostare il percorso del database offline

TodoApp.iOS Nel progetto modificare il ViewControllers\HomeViewController.cs file. Modificare la definizione di RemoteTodoService nel costruttore come indicato di seguito:

TodoService = new RemoteTodoService(async () => await GetAuthenticationToken())
{
    OfflineDb = Xamarin.Essentials.FileSystem.AppDataDirectory + "/offline.db"
};

Se l'esercitazione sull'autenticazione non è stata completata, la definizione dovrebbe essere simile alla seguente:

TodoService = new RemoteTodoService()
{
    OfflineDb = Xamarin.Essentials.FileSystem.AppDataDirectory + "/offline.db"
};

Testare l'app

L'app non viene sincronizzata con il back-end finché non viene premuta l'icona di aggiornamento. Per testare:

  1. Apri il portale di Azure.

  2. Aprire il gruppo di risorse che contiene le risorse per l'avvio rapido.

  3. Selezionare il quickstart database.

  4. Selezionare l'editor di query (anteprima).

  5. Accedere con l'autenticazione di SQL Server usando le stesse credenziali configurate per il database.

    • Se necessario, verrà richiesto di consentire l'accesso per l'indirizzo IP. Selezionare il collegamento per aggiornare l'elenco consenti, quindi premere OK per ritentare l'accesso.
  6. Nell'editor di query immettere SELECT * FROM [dbo].[TodoItems]. Quindi seleziona Esegui.

Verrà visualizzato un elenco degli elementi TodoItem correnti.

Screenshot of the results in the S Q L query editor.

Apportare ora alcune modifiche tramite l'app. NON PREMERE L'AGGIORNAMENTO (ancora).

Ripetere l'istruzione SQL nella portale di Azure e verificare che non siano state apportate modifiche ai dati nel database.

Selezionare l'icona Aggiorna nell'app per eseguire il push dei dati nella coda nel servizio back-end. Le transazioni HTTP vengono visualizzate nella finestra Debug di output.

Ripetere l'istruzione SQL nel portale di Azure e verificare che le modifiche siano state spostate nel servizio remoto.

Pulire le risorse

A meno che non si stia eseguendo un'altra esercitazione introduttiva, è ora possibile eliminare le risorse associate al servizio back-end.

  1. Apri il portale di Azure.
  2. Selezionare il gruppo di risorse che contiene le risorse di avvio rapido.
  3. Selezionare Elimina gruppo di risorse.
  4. Seguire le istruzioni per confermare l'eliminazione.

È possibile anche usare l'interfaccia della riga di comando di Azure:

az group delete -g quickstart

Se è stata usata l'interfaccia della riga di comando per sviluppatori di Azure per distribuire le risorse, è possibile usare invece il azd down comando .

Il completamento dell'eliminazione richiederà alcuni minuti.

Passaggi successivi