Bagikan melalui


Aktifkan sinkronisasi offline untuk aplikasi seluler Xamarin.Forms Anda

Gambaran Umum

Tutorial ini memperkenalkan fitur sinkronisasi offline Azure Mobile Apps untuk Xamarin.Forms. Sinkronisasi offline memungkinkan pengguna akhir untuk berinteraksi dengan aplikasi seluler - melihat, menambahkan, atau memodifikasi data - bahkan ketika tidak ada koneksi jaringan. Perubahan disimpan di dalam database lokal. Setelah perangkat kembali online, perubahan ini disinkronkan dengan layanan jarak jauh.

Tutorial ini didasarkan pada solusi mulai cepat Xamarin.Forms untuk Aplikasi Seluler yang Anda buat saat anda menyelesaikan tutorial [Buat aplikasi iOS Xamarin]. Solusi mulai cepat untuk Xamarin.Forms berisi kode untuk mendukung sinkronisasi offline, yang hanya perlu diaktifkan. Dalam tutorial ini, Anda memperbarui solusi mulai cepat untuk mengaktifkan fitur offline Azure Mobile Apps. Kami juga menyoroti kode khusus offline di aplikasi. Jika Anda tidak menggunakan solusi mulai cepat yang diunduh, Anda harus menambahkan paket ekstensi akses data ke proyek Anda. Untuk informasi selengkapnya tentang paket ekstensi server, lihat Bekerja dengan SDK server backend .NET untuk Azure Mobile Apps.

Untuk mempelajari selengkapnya mengenai fitur sinkronisasi offline, lihat topik Sinkronisasi Data Offline di Azure Mobile Apps.

Aktifkan fungsionalitas sinkronisasi offline dalam solusi mulai cepat

Kode sinkronisasi offline disertakan dalam proyek dengan menggunakan arahan preprocessor C#. Ketika simbol OFFLINE_SYNC_ENABLED didefinisikan, jalur kode ini disertakan dalam build. Untuk aplikasi Windows, Anda juga harus menginstal platform SQLite.

  1. Di Visual Studio, klik kanan solusi >Kelola Paket NuGet untuk Solusi..., lalu cari dan instal paket Microsoft.Azure.Mobile.Client.SQLiteStore NuGet untuk semua proyek dalam solusi.

  2. Di Penjelajah Solusi, buka file TodoItemManager.cs dari proyek dengan Portable dalam nama, yaitu proyek Perpustakaan Kelas Portabel, lalu uncomment direktif preprocessor berikut:

     #define OFFLINE_SYNC_ENABLED
    
  3. (Opsional) Untuk mendukung perangkat Windows, instal salah satu paket runtime SQLite berikut:

  4. (Opsional) Di setiap proyek aplikasi Windows, klik kanan ReferensiAdd> Referensi ..., perluas ekstensi folder > Windows. Aktifkan SQLite yang sesuai untuk SDK Windows bersama dengan Visual C ++ 2013 Runtime untuk SDK Windows. Nama SDK SQLite sedikit berbeda dengan setiap platform Windows.

Meninjau kode sinkronisasi klien

Berikut adalah ikhtisar singkat tentang apa yang sudah termasuk dalam kode tutorial di #if OFFLINE_SYNC_ENABLED dalam arahan. Fungsi sinkronisasi offline ada di file proyek TodoItemManager.cs dalam proyek Perpustakaan Kelas Portabel. Untuk gambaran umum konseptual fitur ini, lihat Sinkronisasi Data Offline di Azure Mobile Apps.

  • Sebelum operasi tabel dapat dilakukan, toko lokal harus diinsialisasi. Database penyimpanan lokal diinsialisasi di konstruktor kelas TodoItemManager dengan menggunakan kode berikut:

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

    Kode ini membuat database SQLite lokal baru menggunakan kelas MobileServiceSQLiteStore .

    Metode DefineTable membuat tabel di toko lokal yang cocok dengan bidang dalam jenis yang disediakan. Jenisnya tidak harus menyertakan semua kolom yang ada di database jarak jauh. Dimungkinkan untuk menyimpan subset kolom.

  • Bidang todoTable di TodoItemManager adalah tipe IMobileServiceSyncTable , bukan IMobileServiceTable. Kelas ini menggunakan database lokal untuk semua operasi tabel buat, baca, perbarui, dan hapus (CRUD). Anda memutuskan kapan perubahan tersebut didorong ke backend Aplikasi Seluler dengan memanggil PushAsync di IMobileServiceSyncContext. Konteks sinkronisasi membantu menjaga hubungan tabel dengan melacak dan mendorong perubahan di semua tabel yang telah dimodifikasi aplikasi klien saat PushAsync dipanggil.

    Metode SyncAsync berikut dipanggil untuk disinkronkan dengan backend Aplikasi Seluler:

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

    Sampel ini menggunakan penanganan kesalahan sederhana dengan penangan sinkronisasi default. Aplikasi nyata akan menangani berbagai kesalahan seperti kondisi jaringan dan konflik server dengan menggunakan implementasi IMobileServiceSyncHandler kustom.

Pertimbangan sinkronisasi offline

Dalam sampel, metode SyncAsync hanya dipanggil saat start-up dan saat sinkronisasi diminta. Untuk memulai sinkronisasi di aplikasi Android atau iOS, tarik ke bawah pada daftar item; untuk Windows, gunakan tombol Sinkronkan. Dalam aplikasi dunia nyata, Anda juga dapat membuat pemicu sinkronisasi saat status jaringan berubah.

Ketika tarikan dijalankan terhadap tabel yang telah menunggu pembaruan lokal yang dilacak oleh konteks, operasi tarik tersebut secara otomatis memicu dorongan konteks sebelumnya. Saat menyegarkan, menambahkan, dan menyelesaikan item dalam sampel ini, Anda dapat menghilangkan panggilan PushAsync eksplisit.

Dalam kode yang disediakan, semua catatan dalam tabel TodoItem jarak jauh dikueri, tetapi juga dimungkinkan untuk memfilter rekaman dengan meneruskan id kueri dan kueri ke PushAsync. Untuk informasi selengkapnya, lihat bagian Sinkronisasi Inkremental dalam Sinkronisasi Data Offline di Azure Mobile Apps.

Menjalankan aplikasi klien

Dengan sinkronisasi offline sekarang diaktifkan, jalankan aplikasi klien setidaknya sekali di setiap platform untuk mengisi database toko lokal. Kemudian, simulasikan skenario offline dan ubah data di toko lokal saat aplikasi sedang offline.

Memperbarui perilaku sinkronisasi aplikasi klien

Di bagian ini, ubah proyek klien untuk mensimulasikan skenario offline dengan menggunakan URL aplikasi yang tidak valid untuk backend Anda. Atau, Anda dapat mematikan koneksi jaringan dengan memindahkan perangkat Anda ke "Mode pesawat". Saat Anda menambahkan atau mengubah item data, perubahan ini disimpan di toko lokal, tetapi tidak disinkronkan ke penyimpanan data backend hingga koneksi dibuat ulang.

  1. Di Penjelajah Solusi, buka file proyek Constants.cs dari proyek Portabel dan ubah nilai ApplicationURL untuk menunjuk ke URL yang tidak valid:

     public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
    
  2. Buka file TodoItemManager.cs dari proyek Portabel , lalu tambahkan tangkapan untuk kelas Exception dasar ke try... tangkap blok di SyncAsync. Blok tangkapan ini menulis pesan pengecualian ke konsol, sebagai berikut:

         catch (Exception ex)
         {
             Console.Error.WriteLine(@"Exception: {0}", ex.Message);
         }
    
  3. Bangun dan jalankan aplikasi klien. Tambahkan beberapa item baru. Perhatikan bahwa pengecualian masuk ke konsol untuk setiap upaya disinkronkan dengan backend. Item baru ini hanya ada di toko lokal sampai mereka dapat didorong ke backend seluler. Aplikasi klien berperilaku seolah-olah terhubung ke backend, mendukung semua operasi buat, baca, perbarui, hapus (CRUD).

  4. Tutup aplikasi dan mulai ulang untuk memverifikasi bahwa item baru yang Anda buat bertahan ke toko lokal.

  5. (Opsional) Gunakan Visual Studio untuk melihat tabel Azure SQL Database Anda untuk melihat bahwa data dalam database backend tidak berubah.

    Di Visual Studio, buka Server Explorer. Navigasikan ke database Anda di DatabaseSQL Azure>. Klik kanan database Anda dan pilih Buka di SQL Server Object Explorer. Sekarang Anda dapat menelusuri ke daftar database SQL Anda dan isinya.

Perbarui aplikasi klien untuk menyambungkan kembali backend seluler Anda

Di bagian ini, hubungkan kembali aplikasi ke backend seluler, yang mensimulasikan aplikasi yang kembali ke status online. Saat Anda melakukan gerakan refresh, data disinkronkan ke backend seluler Anda.

  1. Buka kembali Konstanta.cs. Perbaiki titik applicationURL ke URL yang benar.

  2. Membangun kembali dan menjalankan aplikasi klien. Aplikasi ini mencoba untuk menyinkronkan dengan backend aplikasi seluler setelah diluncurkan. Verifikasi bahwa tidak ada pengecualian yang masuk ke konsol debug.

  3. (Opsional) Lihat data yang diperbarui menggunakan SQL Server Object Explorer atau alat REST seperti Fiddler atau Postman. Perhatikan bahwa data telah disinkronkan antara database backend dan toko lokal.

    Perhatikan bahwa data telah disinkronkan antara database dan toko lokal dan berisi item yang Anda tambahkan saat aplikasi Terputus.

Sumber Daya Tambahan