Offlinesynchronisatie inschakelen voor uw mobiele Xamarin.Forms-app
Overzicht
In deze zelfstudie maakt u kennis met de functie voor offlinesynchronisatie van Azure Mobile Apps voor Xamarin.Forms. Met offlinesynchronisatie kunnen eindgebruikers communiceren met een mobiele app, zoals het weergeven, toevoegen of wijzigen van gegevens, zelfs wanneer er geen netwerkverbinding is. Wijzigingen worden opgeslagen in een lokale database. Zodra het apparaat weer online is, worden deze wijzigingen gesynchroniseerd met de externe service.
Deze zelfstudie is gebaseerd op de Xamarin.Forms-quickstartoplossing voor Mobile Apps die u maakt wanneer u de zelfstudie [Een Xamarin iOS-app maken] voltooit. De quickstart-oplossing voor Xamarin.Forms bevat de code voor het ondersteunen van offlinesynchronisatie, die alleen moet worden ingeschakeld. In deze zelfstudie werkt u de quickstart-oplossing bij om de offlinefuncties van Azure Mobile Apps. We markeren ook de offlinespecifieke code in de app. Als u de gedownloade quickstart-oplossing niet gebruikt, moet u de extensiepakketten voor gegevenstoegang toevoegen aan uw project. Zie Work with the .NET backend server SDK for Azure Mobile Apps (Werken met de .NET-back-endserver-SDK voor Azure Mobile Apps) voor meer informatie over serverextensiepakketten.
Zie het onderwerp Offline Data Sync in Azure Mobile Apps voor meer informatie over de functie voor offlinesynchronisatie.
Offlinesynchronisatiefunctionaliteit inschakelen in de quickstart-oplossing
De offlinesynchronisatiecode is opgenomen in het project met behulp van C#-preprocessor-instructies. Wanneer het OFFLINE_SYNC_ENABLED is gedefinieerd, worden deze codepaden opgenomen in de build. Voor Windows-apps moet u ook het SQLite-platform installeren.
Klik Visual Studio met de rechtermuisknop op de oplossing NuGet-pakketten beheren voor oplossing... en zoek en installeer het Microsoft.Azure.Mobile.Client.SQLiteStore NuGet-pakket > voor alle projecten in de oplossing.
Open in Solution Explorer het bestand TodoItemManager.cs vanuit het project met Portable in de naam . Dit is het Portable Class Library-project. Ontwerk vervolgens de volgende preprocessor-richtlijn:
#define OFFLINE_SYNC_ENABLED
(Optioneel) Installeer een Windows van de volgende SQLite-runtimepakketten ter ondersteuning van uw apparaten:
Windows 8.1 Runtime:SQLite installeren voor Windows 8.1.
Windows Phone 8.1:SQLite installeren voor Windows Phone 8.1.
Universeel Windows-platformSQLite installeren voor universal Windows Universal.
Hoewel de quickstart geen Universal Windows-project bevat, wordt het Universal Windows-platform ondersteund met Xamarin Forms.
(Optioneel) Klik in Windows app-project met de rechtermuisknop op VerwijzingenReferentie toevoegen... en vouw de map Extensies>Windowsuit>. Schakel de juiste SQLite in Windows SDK samen met de Visual C++ 2013 Runtime voor Windows SDK. De SQLite SDK-namen verschillen enigszins per Windows platform.
De synchronisatiecode van de client controleren
Hier is een kort overzicht van wat al is opgenomen in de zelfstudiecode in de - #if OFFLINE_SYNC_ENABLED
instructies. De functionaliteit voor offlinesynchronisatie staat in het projectbestand TodoItemManager.cs in het project Portable Class Library. Zie Offline-Data Sync in Azure Mobile Apps voor een conceptueel overzicht van Mobile Apps.
Voordat tabelbewerkingen kunnen worden uitgevoerd, moet het lokale opslag worden initialiseren. De lokale store-database wordt met behulp van de volgende code in de klasse constructor TodoItemManager initialiseerd:
var store = new MobileServiceSQLiteStore(OfflineDbPath); store.DefineTable<TodoItem>(); //Initializes the SyncContext using the default IMobileServiceSyncHandler. this.client.SyncContext.InitializeAsync(store); this.todoTable = client.GetSyncTable<TodoItem>();
Met deze code maakt u een nieuwe lokale SQLite-database met behulp van de klasse MobileServiceSQLiteStore .
Met de methode DefineTable maakt u een tabel in het lokale winkel die overeenkomt met de velden in het opgegeven type. Het type hoeft niet alle kolommen in de externe database op te nemen. Het is mogelijk om een subset kolommen op te slaan.
Het veld todoTable in TodoItemManager is een IMobileServiceSyncTable-type in plaats van IMobileServiceTable. Deze klasse gebruikt de lokale database voor alle CRUD-tabelbewerkingen (maken, lezen, bijwerken en verwijderen). U bepaalt wanneer deze wijzigingen naar de back-end van de mobiele app worden pushen door PushAsync aan te roepen op de IMobileServiceSyncContext. De synchronisatiecontext helpt tabelrelaties te behouden door wijzigingen in alle tabellen bij te houden en te pushen die een client-app heeft gewijzigd wanneer PushAsync wordt aangeroepen.
De volgende SyncAsync-methode wordt aangeroepen om te synchroniseren met de back-end van de mobiele app:
public async Task SyncAsync() { ReadOnlyCollection<MobileServiceTableOperationError> syncErrors = null; try { await this.client.SyncContext.PushAsync(); await this.todoTable.PullAsync( "allTodoItems", this.todoTable.CreateQuery()); } catch (MobileServicePushFailedException exc) { if (exc.PushResult != null) { syncErrors = exc.PushResult.Errors; } } // Simple error/conflict handling. if (syncErrors != null) { foreach (var error in syncErrors) { if (error.OperationKind == MobileServiceTableOperationKind.Update && error.Result != null) { //Update failed, reverting to server's copy. await error.CancelAndUpdateItemAsync(error.Result); } else { // Discard local change. await error.CancelAndDiscardItemAsync(); } Debug.WriteLine(@"Error executing sync operation. Item: {0} ({1}). Operation discarded.", error.TableName, error.Item["id"]); } } }
In dit voorbeeld wordt gebruikgemaakt van eenvoudige foutafhandeling met de standaardsynchronisatie-handler. Een echte toepassing verwerkt de verschillende fouten, zoals netwerkomstandigheden en serverconflicten, met behulp van een aangepaste implementatie van IMobileServiceSyncHandler .
Overwegingen voor offlinesynchronisatie
In het voorbeeld wordt de methode SyncAsync alleen aangeroepen bij het starten en wanneer een synchronisatie wordt aangevraagd. Als u een synchronisatie wilt initiëren in een Android- of iOS-app, gaat u naar de lijst met items; Gebruik Windows de knop Synchroniseren. In een echte toepassing kunt u ook de synchronisatietrigger maken wanneer de netwerktoestand verandert.
Wanneer een pull-bewerking wordt uitgevoerd voor een tabel met wachtende lokale updates die door de context worden bijgespoord, activeert die pull-bewerking automatisch een voorgaande context-push. Wanneer u items in dit voorbeeld ververst, toevoegt en voltooit, kunt u de expliciete PushAsync-aanroep weglaten.
In de opgegeven code worden alle records in de externe todoItem-tabel opgevraagd, maar het is ook mogelijk om records te filteren door een query-id en query door te geven aan PushAsync. Zie de sectie Incrementele synchronisatie in offline-Data Sync in Azure Mobile Apps.
De client-app uitvoeren
Als offlinesynchronisatie nu is ingeschakeld, moet u de clienttoepassing ten minste één keer op elk platform uitvoeren om de lokale winkeldatabase te vullen. Simuleer later een offlinescenario en wijzig de gegevens in de lokale store terwijl de app offline is.
Het synchronisatiegedrag van de client-app bijwerken
In deze sectie wijzigt u het clientproject om een offlinescenario te simuleren met behulp van een ongeldige toepassings-URL voor uw back-end. U kunt ook netwerkverbindingen uitschakelen door uw apparaat naar de vliegtuigmodus te verplaatsen. Wanneer u gegevensitems toevoegt of wijzigt, worden deze wijzigingen bewaard in het lokale opslag, maar niet gesynchroniseerd met het gegevensopslag in de back-mail totdat de verbinding opnieuw tot stand is gebracht.
Open in Solution Explorer het projectbestand Constants.cs vanuit het Portable-project en wijzig de waarde van
ApplicationURL
om te wijzen naar een ongeldige URL:public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
Open het bestand TodoItemManager.cs vanuit het Portable-project en voeg vervolgens een catch voor de klasse Base Exception toe aan de try... catch block in SyncAsync. Dit catch-blok schrijft het uitzonderingsbericht als volgt naar de console:
catch (Exception ex) { Console.Error.WriteLine(@"Exception: {0}", ex.Message); }
Bouw de client-app en voer deze uit. Voeg enkele nieuwe items toe. U ziet dat er een uitzondering wordt geregistreerd in de console voor elke poging om te synchroniseren met de back-end. Deze nieuwe items bestaan alleen in het lokale winkel totdat ze naar de mobiele back-end kunnen worden pushen. De client-app gedraagt zich alsof deze is verbonden met de back-end en ondersteunt alle CRUD-bewerkingen (create, read, update, delete).
Sluit de app en start deze opnieuw om te controleren of de nieuwe items die u hebt gemaakt, persistent zijn in de lokale store.
(Optioneel) Gebruik Visual Studio om uw Azure SQL Database tabel weer te geven om te zien dat de gegevens in de back-enddatabase niet zijn gewijzigd.
Open Visual Studio in Server Explorer. Navigeer naar uw database in Azure-SQL>Databases. Klik met de rechtermuisknop op uw database en selecteer Openen in SQL Server Objectverkenner. U kunt nu bladeren naar uw SQL databasetabel en de inhoud ervan.
Werk de client-app bij om opnieuw verbinding te maken met uw mobiele back-end
In deze sectie maakt u de app opnieuw verbinding met de mobiele back-end, waarmee wordt gesimuleerd dat de app weer online komt. Wanneer u het vernieuwingsgebaar maakt, worden gegevens gesynchroniseerd met uw mobiele back-end.
Open Constants.cs opnieuw. Corrigeert
applicationURL
de om naar de juiste URL te wijzen.Bouw de client-app opnieuw en voer deze uit. De app probeert na het starten te synchroniseren met de back-end van de mobiele app. Controleer of er geen uitzonderingen zijn vastgelegd in de foutopsporingsconsole.
(Optioneel) Bekijk de bijgewerkte gegevens met behulp SQL Server Objectverkenner of een REST-hulpprogramma zoals Fiddler of Postman. U ziet dat de gegevens zijn gesynchroniseerd tussen de back-enddatabase en het lokale opslagbestand.
U ziet dat de gegevens zijn gesynchroniseerd tussen de database en het lokale winkel en dat deze de items bevatten die u hebt toegevoegd terwijl de verbinding met uw app werd verbroken.