Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Översikt
I den här självstudien introduceras funktionen för offlinesynkronisering i Azure Mobile Apps for Xamarin.Forms. Med offlinesynkronisering kan slutanvändarna interagera med en mobilapp – visa, lägga till eller ändra data – även om det inte finns någon nätverksanslutning. Ändringar lagras i en lokal databas. När enheten är online igen synkroniseras dessa ändringar med fjärrtjänsten.
Den här självstudien baseras på snabbstartslösningen Xamarin.Forms för Mobile Apps som du skapar när du slutför självstudien [Skapa en Xamarin iOS-app]. Snabbstartslösningen för Xamarin.Forms innehåller koden för att stödja offlinesynkronisering, som bara behöver aktiveras. I den här självstudien uppdaterar du snabbstartslösningen för att aktivera offlinefunktionerna i Azure Mobile Apps. Vi markerar även den offlinespecifika koden i appen. Om du inte använder den nedladdade snabbstartslösningen måste du lägga till paketen för dataåtkomsttillägg i projektet. Mer information om servertilläggspaket finns i Work with the .NET backend server SDK for Azure Mobile Apps.
Mer information om funktionen för offlinesynkronisering finns i avsnittet Offline Data Sync i Azure Mobile Apps.
Aktivera funktioner för offlinesynkronisering i snabbstartslösningen
Offlinesynkroniseringskoden ingår i projektet med hjälp av C#-förprocessordirektiv. När symbolen OFFLINE_SYNC_ENABLED är definierad inkluderas dessa kodsökvägar i bygget. För Windows-appar måste du också installera SQLite-plattformen.
- I Visual Studio högerklickar du på lösningen >Hantera NuGet-paket för lösning...och söker sedan efter och installerar Microsoft.Azure.Mobile.Client.SQLiteStore- NuGet-paket för alla projekt i lösningen. 
- I Solution Explorer öppnar du filen TodoItemManager.cs från projektet med Portable i namnet, vilket är ett Portable Class Library-projekt, och avkommenterar sedan följande förprocessordirektiv: - #define OFFLINE_SYNC_ENABLED
- (Valfritt) Installera något av följande SQLite-körningspaket för att stödja Windows-enheter: - Windows 8.1-körning: Installera SQLite för Windows 8.1. 
- Windows Phone 8.1: Installera SQLite för Windows Phone 8.1. 
- Universell Windows-plattform Installera SQLite för Universal Windows Universal. - Även om snabbstarten inte innehåller något Universal Windows-projekt stöds den universella Windows-plattformen med Xamarin Forms. 
 
- (Valfritt) I varje Windows-appprojekt högerklickardu på Referenser >Lägg till referens... och expanderar Windows-mapptilläggen.> Aktivera lämplig SQLite för Windows SDK tillsammans med Visual C++ 2013 Runtime för Windows SDK. SQLite SDK-namnen varierar något för varje Windows-plattform. 
Granska koden för klientsynkronisering
Här är en kort översikt över vad som redan ingår i kod för självstudier inom #if OFFLINE_SYNC_ENABLED-direktiven. Funktionen för offlinesynkronisering finns i projektfilen TodoItemManager.cs i projektet Portable Class Library. En översikt över funktionen finns i Offline Data Sync i Azure Mobile Apps.
- Innan några tabellåtgärder kan utföras måste det lokala lagret initieras. Den lokala lagringsdatabasen initieras i klasskonstruktorn TodoItemManager med hjälp av följande kod: - 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>();- Den här koden skapar en ny lokal SQLite-databas med klassen MobileServiceSQLiteStore . - Metoden DefineTable skapar en tabell i det lokala arkivet som matchar fälten i den angivna typen. Typen behöver inte innehålla alla kolumner som finns i fjärrdatabasen. Det går att lagra en delmängd kolumner. 
- Fältet todoTable i TodoItemManager är en IMobileServiceSyncTable-typ i stället för IMobileServiceTable. Den här klassen använder den lokala databasen för alla crud-tabellåtgärder (create, read, update och delete). Du bestämmer när ändringarna skickas till mobilappens serverdel genom att anropa PushAsync på IMobileServiceSyncContext. Synkroniseringskontexten hjälper till att bevara tabellrelationer genom att spåra och skicka ändringar i alla tabeller som en klientapp har ändrat när PushAsync anropas. - Följande SyncAsync-metod anropas för att synkronisera med mobilappens serverdel: - 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"]); } } }- Det här exemplet använder enkel felhantering med standardsynkroniseringshanteraren. Ett verkligt program skulle hantera de olika felen som nätverksvillkor och serverkonflikter med hjälp av en anpassad IMobileServiceSyncHandler-implementering . 
Överväganden vid offlinesynkronisering
I exemplet anropas metoden SyncAsync endast vid start och när en synkronisering begärs. Om du vill initiera en synkronisering i en Android- eller iOS-app drar du ned objektlistan. för Windows använder du knappen Synkronisera . I en verklig applikation kan du också få synkroniseringen att utlösas när nätverkstillståndet ändras.
När en pull körs mot en tabell som har väntande lokala uppdateringar som spåras av kontexten utlöser pull-åtgärden automatiskt en föregående kontext-push. När du uppdaterar, lägger till och slutför objekt i det här exemplet kan du utelämna det explicita PushAsync-anropet .
I den angivna koden efterfrågas alla poster i den fjärranslutna TodoItem-tabellen, men det går också att filtrera poster genom att skicka ett fråge-ID och en fråga till PushAsync. Mer information finns i avsnittet Inkrementell synkronisering i Offline Data Sync i Azure Mobile Apps.
Kör klientappen
När offlinesynkronisering nu är aktiverat kör du klientprogrammet minst en gång på varje plattform för att fylla i den lokala lagringsdatabasen. Senare simulerar du ett offlinescenario och ändrar data i den lokala lagringen medan appen är offline.
Uppdatera synkroniseringsbeteendet för klientappen
I det här avsnittet ändrar du klientprojektet för att simulera ett offlinescenario med hjälp av en ogiltig program-URL för serverdelen. Du kan också stänga av nätverksanslutningar genom att flytta enheten till "Flygplansläge". När du lägger till eller ändrar dataobjekt lagras dessa ändringar i det lokala arkivet, men synkroniseras inte till serverdelsdatalagret förrän anslutningen har återupprättats.
- I Solution Explorer öppnar du Constants.cs-projektfilen från det bärbara projektet och ändrar värdet - ApplicationURLför så att det pekar på en ogiltig URL:- public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
- Öppna filen TodoItemManager.cs från Portable-projektet och lägg sedan till en catch för bas-Exception-klassen i try...catch-blocket i SyncAsync. Det här catch-blocket skriver undantagsmeddelandet till konsolen enligt följande: - catch (Exception ex) { Console.Error.WriteLine(@"Exception: {0}", ex.Message); }
- Skapa och kör klientappen. Lägg till några nya objekt. Observera att ett undantag loggas i konsolen för varje försök att synkronisera med serverdelen. Dessa nya artiklar finns bara i den lokala butiken tills de kan överföras till mobilens backend. Klientappen fungerar som om den är ansluten till serverdelen och stöder alla crud-åtgärder (create, read, update, delete). 
- Stäng appen och starta om den för att kontrollera att de nya objekten som du skapade är kvar i det lokala lagret. 
- (Valfritt) Använd Visual Studio för att visa din Azure SQL Database-tabell för att se att data i serverdelsdatabasen inte har ändrats. - Öppna ServerUtforskaren i Visual Studio. Gå till din databas i Azure->SQL Databases. Högerklicka på databasen och välj Öppna i SQL Server Object Explorer. Nu kan du bläddra till sql-databastabellen och dess innehåll. 
Uppdatera klientappen för att återansluta din mobila serverdel
I det här avsnittet återansluter du appen till den mobila serverdelen, som simulerar att appen kommer tillbaka till ett onlinetillstånd. När du utför uppdateringsgesten synkroniseras data till din mobila serverdel.
- Öppna Constants.cs igen. - applicationURLKorrigera för att peka på rätt URL.
- Bygg om och kör klientappen. Appen försöker synkronisera med mobilappens serverdel när den har startats. Kontrollera att inga undantag loggas i felsökningskonsolen. 
- (Valfritt) Visa uppdaterade data med antingen SQL Server Object Explorer eller ett REST-verktyg som Fiddler eller Postman. Observera att data har synkroniserats mellan backend-databasen och det lokala lagret. - Observera att data har synkroniserats mellan databasen och det lokala arkivet och innehåller de objekt som du lade till när appen kopplades från.