Sdílet prostřednictvím


Povolení offline synchronizace pro mobilní aplikaci Xamarin.Android

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í.

  1. 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.
  2. Otevřete soubor ToDoActivity.cs a odkomentujte definici #define OFFLINE_SYNC_ENABLED.
  3. 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.

  1. 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.

  2. Stisknutím klávesy F5 sestavte a spusťte aplikaci. Všimněte si, že synchronizace se po spuštění aplikace nezdařila.

  3. 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.

  4. 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.

  5. (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.

  6. (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í.

  1. Otevřete ToDoActivity.cs ve sdíleném projektu a vraťte změnu vlastnosti applicationURL.

  2. 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.

  3. (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.

  4. V aplikaci kliknutím na zaškrtávací políčko vedle několika položek je dokončete v místním obchodě.

    CheckItem volá SyncAsync, aby synchronizoval každou dokončenou položku s backendem mobilní aplikace. SyncAsync volá 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řídy MobileServiceSQLiteStore poskytované klientskou sadou SDK služby Azure Mobile Apps.

    Metoda DefineTable vytvoří tabulku v místním úložišti, která odpovídá polím v zadaném typu, ToDoItem v 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 toDoTable z ToDoActivity je typu IMobileServiceSyncTable místo IMobileServiceTable. 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é TodoItem tabulce dotazovány, ale je také možné filtrovat záznamy předáním ID dotazu a dotazu do PushAsync. 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");
          }
      }
    

Další zdroje informací