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 för Xamarin.Android. 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.
I den här självstudien uppdaterar du klientprojektet från självstudien Skapa en Xamarin Android-app för att stödja offlinefunktionerna i Azure Mobile Apps. Om du inte använder det nedladdade snabbstartsserverprojektet 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.
Uppdatera klientappen för att stödja offlinefunktioner
Med offlinefunktioner i Azure Mobile App kan du interagera med en lokal databas när du befinner dig i ett offlinescenario. Om du vill använda dessa funktioner i din app initierar du en SyncContext- till en lokal butik. Referera sedan till tabellen via gränssnittet IMobileServiceSyncTable. SQLite används som det lokala arkivet på enheten.
- I Visual Studio öppnar du NuGet-pakethanteraren i det projekt som du slutförde i självstudien Skapa en Xamarin Android-app. Sök efter och installera Microsoft.Azure.Mobile.Client.SQLiteStore NuGet-paketet.
- Öppna filen ToDoActivity.cs och avkommentera
#define OFFLINE_SYNC_ENABLED-definitionen. - I Visual Studio trycker du på F5- för att återskapa och köra klientappen. Appen fungerar på samma sätt som den gjorde innan du aktiverade offlinesynkronisering. Men den lokala databasen fylls nu med data som kan användas i ett offlinescenario.
Uppdatera appen för att koppla bort från backend
I det här avsnittet bryter du anslutningen till mobilappens serverdel för att simulera en offlinesituation. När du lägger till dataobjekt meddelar undantagshanteraren att appen är i offlineläge. I det här tillståndet läggs nya objekt till i det lokala arkivet och synkroniseras med mobilappens serverdel när en push-överföring körs i ett anslutet tillstånd.
Redigera ToDoActivity.cs i det delade projektet. Ändra applicationURL- så att den pekar på en ogiltig URL:
const string applicationURL = @"https://your-service.azurewebsites.fail";Du kan också demonstrera offlinebeteende genom att inaktivera wifi och mobilnät på enheten eller använda flygplansläge.
Tryck på F5 för att skapa och köra appen. Observera att synkroniseringen misslyckades vid uppdatering när appen startades.
Ange nya objekt och observera att push-funktionen misslyckas med statusen [CancelledByNetworkError] varje gång du klickar på Spara. De nya att-göra-objekten finns dock kvar i den lokala lagringen tills de kan överföras till mobilappens bakgrundssystem. Om du undertrycker dessa undantag i en produktionsapp fungerar klientappen som om den fortfarande är ansluten till mobilappens serverdel.
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) Öppna Server Exploreri 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. Kontrollera att data i serverdelsdatabasen inte har ändrats.
(Valfritt) Använd ett REST-verktyg som Fiddler eller Postman för att fråga din mobila serverdel med hjälp av en GET-fråga i formuläret
https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.
Uppdatera appen för att återansluta mobilappens serverdel
I det här avsnittet återansluter du appen till mobilappens serverdel. När du först kör programmet anropar OnCreate händelsehanteraren OnRefreshItemsSelected. Den här metoden anropar SyncAsync för att synkronisera din lokala lagring med backend-databasen.
Öppna ToDoActivity.cs i det delade projektet och återställ ändringen av egenskapen applicationURL.
Tryck på F5 för att återskapa och köra appen. Appen synkroniserar dina lokala ändringar med Azure Mobile App-serverdelen med hjälp av push- och pull-åtgärder när
OnRefreshItemsSelected-metoden körs.(Valfritt) Visa uppdaterade data med antingen SQL Server Object Explorer eller ett REST-verktyg som Fiddler. Observera att data har synkroniserats mellan Azure Mobile App-backenddatabasen och det lokala arkivet.
I appen klickar du på kryssrutan bredvid några artiklar för att slutföra dem i den lokala butiken.
CheckItemanroparSyncAsyncför att synkronisera varje slutfört objekt med mobilappens serverdel.SyncAsyncanropar både push och pull. När du kör en hämtning mot en tabell som klienten har gjort ändringar i körs alltid en push-överföring automatiskt. Detta säkerställer att alla tabeller i det lokala arkivet tillsammans med relationer förblir konsekventa. Det här beteendet kan resultera i en oväntad push. Mer information om det här beteendet finns i Offline Data Sync i Azure Mobile Apps.
Granska koden för klientsynkronisering
Xamarin-klientprojektet som du laddade ned när du slutförde självstudien Skapa en Xamarin Android-app redan innehåller kod som stöder offlinesynkronisering med hjälp av en lokal SQLite-databas. Här är en kort översikt över vad som redan ingår i självstudiekoden. 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 när
ToDoActivity.OnCreate()körToDoActivity.InitLocalStoreAsync(). Den här metoden skapar en lokal SQLite-databas med hjälp av denMobileServiceSQLiteStore-klass som tillhandahålls av Azure Mobile Apps-klient-SDK.Metoden
DefineTableskapar en tabell i det lokala lagret som matchar fälten i den angivna typen,ToDoItemi det här fallet. Typen behöver inte innehålla alla kolumner som finns i fjärrdatabasen. Du kan bara lagra en delmängd kolumner.// ToDoActivity.cs private async Task InitLocalStoreAsync() { // new code to initialize the SQLite store string path = Path.Combine(System.Environment .GetFolderPath(System.Environment.SpecialFolder.Personal), localDbFilename); if (!File.Exists(path)) { File.Create(path).Dispose(); } var store = new MobileServiceSQLiteStore(path); store.DefineTable<ToDoItem>(); // Uses the default conflict handler, which fails on conflict // To use a different conflict handler, pass a parameter to InitializeAsync. // For more details, see https://go.microsoft.com/fwlink/?LinkId=521416. await client.SyncContext.InitializeAsync(store); }Den
toDoTable:e medlemmen iToDoActivityär av typenIMobileServiceSyncTablei stället förIMobileServiceTable. IMobileServiceSyncTable dirigerar alla tabellåtgärder för skapande, läsning, uppdatering och borttagning till den lokala lagringsdatabas.Du bestämmer när ändringar skickas till Azure Mobile App-serverdelen genom att anropa
IMobileServiceSyncContext.PushAsync(). Synkroniseringskontexten hjälper till att bevara tabellrelationer genom att spåra och skicka ändringar i alla tabeller som en klientapp har ändrat närPushAsyncanropas.Den angivna koden anropar
ToDoActivity.SyncAsync()att synkronisera när todoitem-listan uppdateras eller en todoitem läggs till eller slutförs. Koden synkroniseras efter varje lokal ändring.I den angivna koden efterfrågas alla poster i fjärrtabellen
TodoItem, men det går också att filtrera poster genom att skicka ett fråge-ID och en fråga tillPushAsync. Mer information finns i avsnittet Inkrementell synkronisering i Offline Data Sync i Azure Mobile Apps.// ToDoActivity.cs private async Task SyncAsync() { try { await client.SyncContext.PushAsync(); await toDoTable.PullAsync("allTodoItems", toDoTable.CreateQuery()); // query ID is used for incremental sync } catch (Java.Net.MalformedURLException) { CreateAndShowDialog (new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error"); } catch (Exception e) { CreateAndShowDialog (e, "Error"); } }