Sdílet prostřednictvím


Povolení offline synchronizace pro mobilní aplikaci Xamarin.Android

Přehled

V tomto kurzu se seznámíte s funkcí offline synchronizace služby Azure Mobile Apps pro Xamarin.Android. Offline synchronizace umožňuje koncovým uživatelům pracovat s mobilní aplikací – prohlížením, přidává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 klientský projekt z kurzu Vytvoření aplikace Pro Xamarin Android tak, aby podporoval offline funkce azure Mobile Apps. Pokud stažený projekt serveru pro rychlý start nepou ite, 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í interakci s místní databází, když jste v offline scénáři. Pokud chcete tyto funkce použít ve své aplikaci, inicializujete SyncContext do místního úložiště. Pak na tabulku odkazovat prostřednictvím rozhraní IMobileServiceSyncTable . SQLite se používá jako místní úložiště na zařízení.

  1. V Visual Studio otevřete správce balíčků NuGet v projektu, který jste dokončili v kurzu Vytvoření aplikace Xamarin Android. Vyhledejte a nainstalujte balíček NuGet Microsoft.Azure.Mobile.Client.SQLiteStore.
  2. Otevřete soubor ToDoActivity.cs a odkomentování #define OFFLINE_SYNC_ENABLED definice.
  3. V Visual Studio stisknutím klávesy F5 znovu sestavte a spusťte klientskou aplikaci. Aplikace funguje stejně jako před povolením offline synchronizace. Místní databáze je teď ale naplněná daty, která je možné použít v offline scénáři.

Aktualizace aplikace pro odpojení od back-endu

V této části narušíte připojení k back-endu mobilní aplikace, abyste napodobit offline situaci. Když přidáte datové položky, obslužná rutina výjimky vás informuje, že je aplikace v offline režimu. V tomto stavu se nové položky přidané v místním obchodě synchronizují s back-endem mobilní aplikace, když se nabízené oznámení provede v připojeném stavu.

  1. Upravte soubor ToDoActivity.cs ve sdíleném projektu. Změňte applicationURL tak , aby odkazovat na neplatnou adresu URL:

      const string applicationURL = @"https://your-service.azurewebsites.fail";
    

    Můžete také předvést offline chování zakázáním wi-fi a mobilních sítí na zařízení nebo použitím režimu v letadle.

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

  3. Zadejte nové položky a všimněte si, že nabízení selže se stavem [CancelledByNetworkError] pokaždé, když kliknete na Uložit. Nové položky seznamu todo ale existují v místním obchodě, dokud je nebude možné odeslat do back-endu 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 obchodě.

  5. (Volitelné) V Visual Studio otevřete Průzkumník serveru. Přejděte ke své databázi v Azure-SQL>Databases. Klikněte pravým tlačítkem na databázi a vyberte Otevřít v SQL Server Průzkumník objektů. Teď můžete přejít k vaší SQL a jejímu obsahu. Ověřte, že se data v back-endové databázi nezměnila.

  6. (Volitelné) K dotazování mobilního back-endu pomocí dotazu GET ve tvaru https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItempoužijte nástroj REST, jako je Fiddler nebo Postman.

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 volá obslužná rutina OnCreate události OnRefreshItemsSelected. Tato metoda volá k SyncAsync synchronizaci místního úložiště s back-end databází.

  1. Otevřete toDoActivity.cs ve sdíleném projektu a vrátte změny vlastnosti applicationURL .

  2. Stisknutím klávesy F5 aplikaci znovu sestavte a spusťte. Aplikace synchronizuje místní změny s back-endem mobilní aplikace Azure pomocí operací push a pull při OnRefreshItemsSelected spuštění metody.

  3. (Volitelné) Aktualizovaná data můžete zobrazit pomocí SQL Server Průzkumník objektů nebo nástroje REST, jako je Fiddler. Všimněte si, že se data synchronizovala mezi back-endovou databází mobilní aplikace Azure a místním úložištěm.

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

    CheckItem volá SyncAsync k synchronizaci všech dokončených položek s back-endem mobilní aplikace. SyncAsync zavolá metodu push i pull. Pokaždé, když provedete pull proti tabulce, ve které klient provedl změny, se nabízení vždy provede automaticky. Tím zajistíte, že všechny tabulky v místním obchodě spolu s relacemi zůstanou konzistentní. Toto chování může vést k neočekávanému nas nabízenému oznámení. Další informace o tomto chování najdete v tématu Offline Synchronizace dat v Azure Mobile Apps.

Kontrola kódu pro synchronizaci klienta

Projekt klienta Xamarin, který jste stáhli po dokončení kurzu Vytvoření aplikace Xamarin 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 této funkce najdete v tématu Offline Synchronizace dat v Azure Mobile Apps.

  • Než bude možné provést jakékoli operace s tabulkami, musí se inicializovat místní úložiště. Databáze místního úložiště je inicializována při ToDoActivity.OnCreate() spuštění příkazu ToDoActivity.InitLocalStoreAsync(). Tato metoda vytvoří místní databázi SQLite pomocí třídy MobileServiceSQLiteStore poskytované klientskou sadou SDK Mobile Apps Azure.

    Metoda DefineTable vytvoří v místním úložiště tabulku, 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 jen 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 je ToDoActivity typu IMobileServiceSyncTable místo IMobileServiceTable. Tabulka IMobileServiceSyncTable směruje všechny operace crud (vytvoření, čtení, aktualizace a odstranění) do databáze místního úložiště.

    Rozhodnete se, kdy se změny nas nabízené do back-endu mobilní aplikace Azure předá voláním .IMobileServiceSyncContext.PushAsync() Kontext synchronizace pomáhá zachovat relace mezi tabulkami díky sledování a nasazování změn ve všech tabulkách, které klientská aplikace při PushAsync volání upravila.

    Poskytnutý kód volá synchronizaci ToDoActivity.SyncAsync() při každé aktualizaci seznamu úkolů nebo přidání nebo dokončení úkolu. Kód se po každé místní změně synchronizuje.

    V poskytnutém kódu se TodoItem dotazuje na všechny záznamy ve vzdálené tabulce, ale záznamy je také možné filtrovat předáním ID dotazu a dotazu do PushAsync. Další informace najdete v části Přírůstková synchronizace v části 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ší materiály