Xamarin.Android mobil uygulamanız için çevrimdışı eşitlemeyi etkinleştirme

Genel Bakış

Bu öğretici, Xamarin.Android için Azure Mobile Apps çevrimdışı eşitleme özelliğini sunar. Çevrimdışı eşitleme, ağ bağlantısı yoksa bile son kullanıcıların verileri görüntüleme, ekleme veya değiştirme gibi bir mobil uygulamayla etkileşim kurmasını sağlar. Değişiklikler yerel bir veritabanında depolanır. Cihaz yeniden çevrimiçi olduktan sonra bu değişiklikler uzak hizmetle eşitler.

Bu öğreticide, Azure Mobile Apps'ın çevrimdışı özelliklerini desteklemek için Xamarin Android uygulaması oluşturma öğreticisinde istemci projesini Mobile Apps. İndirilen hızlı başlangıç sunucusu projesini kullanasanız, projenize veri erişimi uzantısı paketlerini eklemeniz gerekir. Sunucu uzantısı paketleri hakkında daha fazla bilgi için bkz . Azure hizmetleri için .NET arka uç sunucu SDK'sı ile Mobile Apps.

Çevrimdışı eşitleme özelliği hakkında daha fazla bilgi edinmek için Azure Data Sync çevrimdışı Mobile Apps.

İstemci uygulamasını çevrimdışı özellikleri destekleyecek şekilde güncelleştirme

Azure Mobil Uygulama çevrimdışı özellikleri, çevrimdışı bir senaryodayken yerel veritabanıyla etkileşime geçmenizi sağlar. Bu özellikleri uygulamanıza kullanmak için yerel bir depoda SyncContext başlatabilirsiniz. Ardından IMobileServiceSyncTable arabirimi aracılığıyla tablonıza başvurabilirsiniz. SQLite, cihazda yerel depo olarak kullanılır.

  1. Bu Visual Studio Xamarin Android NuGet oluşturma öğreticisinde tamamlamış olduğunu projesinde NuGet paket yöneticisini açın. Microsoft.Azure.Mobile.Client.SQLiteStore NuGet yükleyin.
  2. ToDoActivity.cs dosyasını açın ve tanımın tanımını #define OFFLINE_SYNC_ENABLED açın.
  3. İstemci Visual Studio yeniden oluşturma ve çalıştırma için F5 tuşuna basın. Uygulama, çevrimdışı eşitlemeyi etkinleştirmeden önce olduğu gibi çalışır. Ancak, yerel veritabanı artık çevrimdışı bir senaryoda kullanılan verilerle doldurulur.

Uygulamayı arka ucun bağlantısını kesecek şekilde güncelleştirme

Bu bölümde, çevrimdışı bir durumun benzetimini yapmak için Mobil Uygulama arka ucuyla bağlantıyı kesmeniz gerekir. Veri öğeleri eklerken, özel durum işleyiciniz uygulamanın çevrimdışı modda olduğunu söyler. Bu durumda, yerel depoya eklenen yeni öğeler, bağlı bir durumda bir itme yürütülürken mobil uygulama arka ucuyla eşitlenmiştir.

  1. Paylaşılan projede ToDoActivity.cs'yi düzenleyin. applicationURL'yi geçersiz bir URL'ye işaret etmek için değiştirme:

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

    Ayrıca cihazda wifi ve hücresel ağları devre dışı bırakarak veya uçak modunu kullanarak çevrimdışı davranışı gösterebilirsiniz.

  2. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. Uygulama başlatılana kadar eşitlemenizin yenilemede başarısız olduğunu fark edin.

  3. Yeni öğeler girin ve Kaydet'e her tıklarken [CancelledByNetworkError] durumuyla itme başarısız olduğunu fark edersiniz. Ancak, yeni todo öğeleri mobil uygulama arka ucuna ertelenene kadar yerel depoda yer alır. Bir üretim uygulamasında, bu özel durumları bastırıyorsanız, istemci uygulama hala mobil uygulama arka ucuna bağlı gibi davranır.

  4. Oluşturduğunuz yeni öğelerin yerel depoda kalıcı olduğunu doğrulamak için uygulamayı kapatın ve yeniden başlatın.

  5. (İsteğe bağlı) Bu Visual Studio' Sunucu Gezgini. Azure-SQL>Veritabanları'SQL gidin. Veritabanınıza sağ tıklayın ve Dosyalarda aç'ı SQL Server Nesne Gezgini. Artık veritabanı tablo ve SQL göz atabilirsiniz. Arka uç veritabanındaki verilerin değişmediğini doğrulayın.

  6. (İsteğe bağlı) Mobil arka ucu sorgulamak için Fiddler veya Postman gibi bir REST aracı kullanın.https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem

Mobil Uygulama arka ucuna yeniden bağlanmak için uygulamayı güncelleştirme

Bu bölümde, uygulamayı mobil uygulama arka ucuna yeniden bağlayın. Uygulamayı ilk kez çalıştırarak olay işleyicisini OnCreate çağırabilirsiniz OnRefreshItemsSelected. Bu yöntem, SyncAsync yerel depolarınızı arka uç veritabanıyla eşitlemek için yöntemini arar.

  1. Paylaşılan projede ToDoActivity.cs'yi açın ve applicationURL özelliği değişikliğinizi geri döndürin.

  2. Uygulamayı yeniden oluşturma ve çalıştırma için F5 tuşuna basın. Uygulama, yöntem yürütülürken itme ve çekme işlemlerini kullanarak yerel değişikliklerinizi Azure Mobil Uygulama arka ucuyla OnRefreshItemsSelected eşitler.

  3. (İsteğe bağlı) Fiddler gibi bir REST SQL Server Nesne Gezgini kullanarak güncelleştirilmiş verileri görüntüleme. Verilerin Azure Mobil Uygulama arka uç veritabanı ile yerel depo arasında eşitlenmiş olduğunu fark edin.

  4. Uygulamada, birkaç öğenin yanındaki onay kutusuna tıklar ve bunları yerel mağazada tamamlar.

    CheckItem , SyncAsync tamamlanan her öğeyi Mobil Uygulama arka ucuyla eşitlemek için çağrıları. SyncAsync hem itme hem de çekme çağrısında bulundu. İstemcinin üzerinde değişiklik yaptığı bir tabloya çekme gerçekleştirerek her zaman otomatik olarak bir itme yürütülür. Bu, yerel depodaki tüm tabloların ve ilişkilerin tutarlı kalmasını sağlar. Bu davranış beklenmeyen bir itmeye neden olabilir. Bu davranış hakkında daha fazla bilgi için bkz. Azure Data Sync çevrimdışı Mobile Apps.

İstemci eşitleme kodunu gözden geçirme

Xamarin Android uygulaması oluşturma öğreticisini tamamlandıktan sonra indirdiğiniz Xamarin istemci projesi, yerel bir SQLite veritabanı kullanarak çevrimdışı eşitlemeyi destekleyen kodu zaten içerir. Burada, öğretici koduna zaten dahil olanlara ilişkin kısa bir genel bakış bulabilirsiniz. Özelle ilgili kavramsal bir genel bakış için bkz. Azure Data Sync çevrimdışı Mobile Apps.

  • Herhangi bir tablo işlemlerinin gerçekleştirilemeden önce yerel depo başlatılmış olması gerekir. yürütülürken yerel depo veritabanı ToDoActivity.OnCreate() başlatılır ToDoActivity.InitLocalStoreAsync(). Bu yöntem, Azure Mobile Apps sdk'sı tarafından sağlanan sınıfını kullanarak yerel bir SQLite MobileServiceSQLiteStore veritabanı oluşturur.

    yöntemi DefineTable , yerel depoda sağlanan türe (bu durumda) eşleşen bir ToDoItem tablo oluşturur. Türün uzak veritabanındaki tüm sütunları içermesi zorunda değil. Sütunların yalnızca bir alt kümesini depolamak mümkündür.

      // 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);
      }
    
  • üyesi toDoTable yerine türündedir IMobileServiceSyncTableIMobileServiceTable.ToDoActivity IMobileServiceSyncTable tüm oluşturma, okuma, güncelleştirme ve silme (CRUD) tablo işlemlerini yerel depo veritabanına yönlendirmektedir.

    Çağrısıyla değişikliklerin Azure Mobil Uygulama arka ucuna ne zaman ekli olduğuna siz karar verirsiniz IMobileServiceSyncContext.PushAsync(). Eşitleme bağlamı, bir istemci uygulamasının çağrıldıklarında değiştir olduğu tüm tablolarda değişiklikleri izleme ve iterek tablo ilişkilerinin korunmasına PushAsync yardımcı olur.

    Sağlanan kod, ToDoActivity.SyncAsync() todoitem listesi her yenilendiğinde veya bir todoitem eklendiğinde veya tamamlandığında eşitlenecek şekilde çağrılır. Her yerel değişiklik sonrasında kod eşitler.

    Sağlanan kodda, uzak tablodaki TodoItem tüm kayıtlar sorgulanmıştır, ancak bir sorgu kimliği ve sorgusu göndererek kayıtları filtrelemek de mümkündür PushAsync. Daha fazla bilgi için Azure Mobile Apps'de Çevrimdışı Data Sync Artımlı Eşitleme bölümüne 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");
          }
      }
    

Ek Kaynaklar