Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
- Android
- Cordova
- Ios
- Windows
- Xamarin.Android
- Xamarin.Forms
- Xamarin.iOS
Přehled
Tento kurz představuje funkci offline synchronizace Azure Mobile Apps pro Xamarin.Android. Offline synchronizace umožňuje koncovým uživatelům pracovat s mobilní aplikací – zobrazením, přidáním nebo úpravou dat – i když není k dispozici žádné síťové připojení. Změny se ukládají v místní databázi. Jakmile je zařízení opět online, tyto změny se synchronizují se vzdálenou službou.
V tomto kurzu aktualizujete projekt klienta z kurzu Vytvoření aplikace pro Xamarin Pro Android tak, aby podporoval offline funkce Azure Mobile Apps. Pokud stažený projekt serveru Rychlý start nepoužíváte, musíte do projektu přidat balíčky rozšíření pro přístup k datům. Další informace o balíčcích rozšíření serveru najdete v tématu Práce se sadou SDK back-endového serveru .NET pro azure Mobile Apps.
Další informace o funkci offline synchronizace najdete v tématu Offline synchronizace dat v Azure Mobile Apps.
Aktualizace klientské aplikace tak, aby podporovala offline funkce
Offline funkce mobilní aplikace Azure umožňují pracovat s místní databází, když jste v offline scénáři. Pokud chcete tyto funkce ve své aplikaci používat, inicializujete SyncContext do místního obchodu. Pak na tabulku odkazujte prostřednictvím rozhraní IMobileServiceSyncTable. SQLite se používá jako místní úložiště na zařízení.
- V aplikaci Visual Studio otevřete Správce balíčků NuGet v projektu dokončeném v kurzu Vytvoření aplikace Xamarin pro Android. Vyhledejte a nainstalujte balíček NuGet Microsoft.Azure.Mobile.Client.SQLiteStore.
- Otevřete soubor ToDoActivity.cs a odkomentujte definici
#define OFFLINE_SYNC_ENABLED. - V sadě Visual Studio stiskněte klávesu F5 a znovu sestavte a spusťte klientskou aplikaci. Aplikace funguje stejně jako předtím, než jste povolili offline synchronizaci. Místní databáze je teď ale naplněna daty, která je možné použít v offline scénáři.
Aktualizace aplikace tak, aby se odpojila od back-endu
V této části přerušíte připojení k back-endu mobilní aplikace a simulujete offline situaci. Když přidáte položky dat, obslužná rutina vás informuje, že je aplikace v offline režimu. V tomto stavu se nové položky přidané v místním úložišti synchronizují s backendem mobilní aplikace, když je v připojeném stavu spuštěna operace push.
Upravte ToDoActivity.cs ve sdíleném projektu. Změňte applicationURL tak, aby odkazovala na neplatnou adresu URL.
const string applicationURL = @"https://your-service.azurewebsites.fail";Můžete si také předvést offline chování zakázáním wi-fi a mobilních sítí na zařízení nebo pomocí režimu v letadle.
Stisknutím klávesy F5 sestavte a spusťte aplikaci. Všimněte si, že synchronizace se po spuštění aplikace nezdařila.
Zadejte nové položky a všimněte si, že operace push selže se stavem [CancelledByNetworkError] pokaždé, když kliknete na Uložit. Nové položky úkolů však zůstávají v místním úložišti, dokud je nebude možné odeslat do zázemí mobilní aplikace. Pokud v produkční aplikaci potlačíte tyto výjimky, klientská aplikace se chová, jako by byla stále připojená k back-endu mobilní aplikace.
Zavřete aplikaci a restartujte ji, abyste ověřili, že nové položky, které jste vytvořili, jsou trvalé v místním úložišti.
(Volitelné) V sadě Visual Studio otevřete Průzkumníka serveru. Přejděte do vaší databáze v Azure–>SQL Databází. Klikněte pravým tlačítkem na databázi a vyberte Otevřít v průzkumníku objektů SQL Serveru. Teď můžete procházet tabulku databáze SQL a její obsah. Ověřte, že se data v back-endové databázi nezměnila.
(Volitelné) K dotazování mobilního back-endu použijte nástroj REST, jako je Fiddler nebo Postman, pomocí dotazu GET ve formuláři
https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.
Aktualizace aplikace pro opětovné připojení back-endu mobilní aplikace
V této části znovu připojte aplikaci k back-endu mobilní aplikace. Při prvním spuštění aplikace se obslužná rutina události OnCreate volá OnRefreshItemsSelected. Tato metoda volá SyncAsync k synchronizaci místního úložiště s back-endovou databází.
Otevřete ToDoActivity.cs ve sdíleném projektu a vraťte změnu vlastnosti applicationURL.
Stisknutím klávesy F5 znovu sestavte a spusťte aplikaci. Aplikace synchronizuje místní změny s back-endem mobilní aplikace Azure pomocí operací push a pull při spuštění metody
OnRefreshItemsSelected.(Volitelné) Aktualizovaná data můžete zobrazit pomocí Průzkumníka objektů SQL Serveru nebo nástroje REST, jako je Fiddler. Všimněte si, že data byla synchronizována mezi back-endovou databází mobilní aplikace Azure a místním úložištěm.
V aplikaci kliknutím na zaškrtávací políčko vedle několika položek je dokončete v místním obchodě.
CheckItemvoláSyncAsync, aby synchronizoval každou dokončenou položku s backendem mobilní aplikace.SyncAsyncvolá jak push, tak pull. Vždy, když provedete operaci pull proti tabulce, ve které klient provedl změny, se automaticky provede také operace push. Tím zajistíte, že všechny tabulky v místním úložišti včetně relací zůstanou konzistentní. Toto chování může vést k neočekávanému nahrání změn. Další informace o tomto chování najdete v tématu Offline synchronizace dat v Azure Mobile Apps.
Kontrola kódu synchronizace klienta
Klientský projekt Xamarinu, který jste stáhli po dokončení kurzu Vytvoření aplikace pro Xamarin Pro Android již obsahuje kód podporující offline synchronizaci pomocí místní databáze SQLite. Tady je stručný přehled toho, co už je součástí kódu kurzu. Koncepční přehled funkce najdete v tématu Offline synchronizace dat v Azure Mobile Apps.
Před provedením jakýchkoli operací tabulky je nutné inicializovat místní úložiště. Databáze místního úložiště se inicializuje při spuštění
ToDoActivity.OnCreate()ToDoActivity.InitLocalStoreAsync(). Tato metoda vytvoří místní databázi SQLite pomocí třídyMobileServiceSQLiteStoreposkytované klientskou sadou SDK služby Azure Mobile Apps.Metoda
DefineTablevytvoří tabulku v místním úložišti, která odpovídá polím v zadaném typu,ToDoItemv tomto případě. Typ nemusí obsahovat všechny sloupce, které jsou ve vzdálené databázi. Je možné uložit pouze podmnožinu sloupců.// 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); }Člen
toDoTablezToDoActivityje typuIMobileServiceSyncTablemístoIMobileServiceTable. IMobileServiceSyncTable směruje všechny operace vytvoření, čtení, aktualizace a odstranění tabulky (CRUD) do místní databáze úložiště.Rozhodnete se, kdy se změny nasdílí do back-endu mobilní aplikace Azure voláním
IMobileServiceSyncContext.PushAsync(). Kontext synchronizace pomáhá zachovat relace mezi tabulkami sledováním a nasdílením změn ve všech tabulkách, které klientská aplikace změnila při zavoláníPushAsync.Kód
ToDoActivity.SyncAsync()je volán ke synchronizaci kdykoliv je seznam úkolů aktualizován nebo když je přidán či dokončen úkol. Kód se synchronizuje po každé místní změně.V zadaném kódu jsou všechny záznamy ve vzdálené
TodoItemtabulce dotazovány, ale je také možné filtrovat záznamy předáním ID dotazu a dotazu doPushAsync. Další informace najdete v části Přírůstková synchronizace v Offline synchronizace dat v 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"); } }