Sdílet prostřednictvím


Povolení offline synchronizace pro mobilní aplikaci Xamarin.Forms

Přehled

Tento kurz představuje funkci offline synchronizace Azure Mobile Apps pro Xamarin.Forms. 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.

Tento kurz je založený na řešení rychlého startu pro Xamarin.Forms pro Mobile Apps, které vytvoříte při dokončení kurzu [Vytvoření aplikace pro Xamarin iOS]. Řešení rychlého startu pro Xamarin.Forms obsahuje kód pro podporu offline synchronizace, který je potřeba povolit. V tomto kurzu aktualizujete řešení pro rychlý start a zapnete offline funkce Azure Mobile Apps. Zvýrazníme také kód specifický pro offline režim v aplikaci. Pokud stažené řešení pro 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.

Povolení funkcí offline synchronizace v řešení pro rychlý start

Offline synchronizační kód je součástí projektu pomocí direktiv preprocesoru jazyka C#. Pokud je definován symbol OFFLINE_SYNC_ENABLED , jsou tyto cesty kódu zahrnuty do sestavení. U aplikací pro Windows musíte také nainstalovat platformu SQLite.

  1. V sadě Visual Studio klikněte pravým tlačítkem na řešení >Spravovat balíčky NuGet pro řešení...a vyhledejte a nainstalujte Microsoft.Azure.Mobile.Client.SQLiteStore balíček NuGet pro všechny projekty v řešení.

  2. V Průzkumníku řešení otevřete soubor TodoItemManager.cs z projektu s příponou Portable v názvu, což je projekt Portable Class Library, a pak odkomentujte následující direktivu preprocesoru:

     #define OFFLINE_SYNC_ENABLED
    
  3. (Volitelné) Pokud chcete podporovat zařízení s Windows, nainstalujte jeden z následujících balíčků modulu runtime SQLite:

  4. (Volitelné) V každém projektu aplikace pro Windows klikněte pravým tlačítkem na Odkazy>Přidat odkaz..., rozbalte rozšíření složky >Windows. Povolte příslušné SQLite SDK pro Windows spolu s Visual C++ 2013 Runtime pro Windows SDK. Názvy sad SDK SQLite se u každé platformy Windows mírně liší.

Kontrola kódu synchronizace klienta

Tady je stručný přehled toho, co už je součástí kódu kurzu uvnitř #if OFFLINE_SYNC_ENABLED direktiv. Funkce offline synchronizace je v souboru projektu TodoItemManager.cs v projektu Portable Class Library. 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ě je inicializována v konstruktoru třídy TodoItemManager pomocí následujícího kódu:

      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>();
    

    Tento kód vytvoří novou místní databázi SQLite pomocí Třídy MobileServiceSQLiteStore .

    Metoda DefineTable vytvoří tabulku v místním úložišti, která odpovídá polím v zadaném typu. Typ nemusí obsahovat všechny sloupce, které jsou ve vzdálené databázi. Je možné uložit podmnožinu sloupců.

  • Pole todoTable v TodoItemManager je typu IMobileServiceSyncTable namísto IMobileServiceTable. Tato třída používá místní databázi pro všechny operace vytvoření, čtení, aktualizace a odstranění tabulky (CRUD). Rozhodnete se, kdy se tyto změny synchronizují do backendu mobilní aplikace voláním PushAsync na IMobileServiceSyncContext. 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 volání PushAsync .

    K synchronizaci s back-endem mobilní aplikace se volá následující metoda SyncAsync :

      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"]);
              }
          }
      }
    

    Tato ukázka používá jednoduché zpracování chyb s výchozí obslužnou rutinou synchronizace. Skutečná aplikace by zpracovávala různé chyby, jako jsou síťové podmínky a konflikty serveru, pomocí vlastní implementace IMobileServiceSyncHandler .

Aspekty offline synchronizace

V ukázce se metoda SyncAsync volá pouze při spuštění a při vyžádání synchronizace. Pokud chcete zahájit synchronizaci v aplikaci pro Android nebo iOS, táhněte dolů seznam položek. Pro Windows použijte tlačítko Synchronizovat. V reálné aplikaci můžete také aktivovat synchronizaci, když se změní stav sítě.

Při provedení stažení do tabulky, která obsahuje čekající místní aktualizace sledované kontextem, tato operace automaticky aktivuje předchozí odeslání kontextu. Při aktualizaci, přidávání a dokončování položek v této ukázce můžete vynechat explicitní volání PushAsync .

V zadaném kódu jsou všechny záznamy ve vzdálené tabulce TodoItem 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.

Spuštění klientské aplikace

Když je teď povolená offline synchronizace, spusťte klientskou aplikaci alespoň jednou na každé platformě a naplňte tak databázi místního úložiště. Později simulovat offline scénář a upravit data v místním úložišti, když je aplikace offline.

Aktualizace chování synchronizace klientské aplikace

V této části upravte projekt klienta tak, aby simuloval offline režim pomocí neplatné URL adresy vaší aplikace pro backend. Případně můžete vypnout síťová připojení tak, že zařízení přesunete do režimu v letadle. Když přidáte nebo změníte datové položky, tyto změny se uchovávají v místním úložišti, ale nesynchronizují se do back-endového úložiště dat, dokud se připojení znovu nenaváže.

  1. V Průzkumníku řešení otevřete soubor projektu Constants.cs z přenosného projektu a změňte hodnotu ApplicationURL na odkaz na neplatnou adresu URL:

     public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
    
  2. Otevřete soubor TodoItemManager.cs z projektu Portable a poté přidejte catch pro základní třídu Exception do bloku try...catch v metodě SyncAsync. Tento blok catch zapíše zprávu o výjimce do konzoly následujícím způsobem:

         catch (Exception ex)
         {
             Console.Error.WriteLine(@"Exception: {0}", ex.Message);
         }
    
  3. Sestavte a spusťte klientskou aplikaci. Přidejte některé nové položky. Všimněte si, že v konzole se zaprotokoluje výjimka pro každý pokus o synchronizaci s backendem. Tyto nové položky existují pouze v místním úložišti, dokud je nelze odeslat do mobilního back-endu. Klientská aplikace se chová, jako by byla připojená k back-endu, která podporuje všechny operace vytvoření, čtení, aktualizace, odstranění (CRUD).

  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é) Pomocí sady Visual Studio zobrazíte tabulku azure SQL Database a zjistíte, že se data v back-endové databázi nezměnila.

    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.

Aktualizace klientské aplikace pro opětovné připojení mobilního back-endu

V této části znovu připojte aplikaci k mobilnímu back-endu, který simuluje, že se aplikace vrátí do online stavu. Když provedete gesto aktualizace, data se synchronizují s mobilním back-endem.

  1. Znovu otevřete Constants.cs. Opravte odkaz applicationURL tak, aby směřoval na správnou adresu URL.

  2. Znovu sestavte a spusťte klientskou aplikaci. Aplikace se po spuštění pokusí synchronizovat s back-endem mobilní aplikace. Ověřte, že v konzole ladění nejsou zaprotokolovány žádné výjimky.

  3. (Volitelné) Aktualizovaná data můžete zobrazit pomocí Průzkumníka objektů SQL Serveru nebo nástroje REST, jako je Fiddler nebo Postman. Všimněte si, že data byla synchronizována mezi back-endovou databází a místním úložištěm.

    Všimněte si, že data byla synchronizována mezi databází a místním úložištěm a obsahuje položky, které jste přidali během odpojení aplikace.

Další zdroje informací