تمكين المزامنة في وضع عدم الاتصال لتطبيق Xamarin.Android للجوال

نظرة عامة

يقدم هذا البرنامج التعليمي ميزة المزامنة دون اتصال بالإنترنت في تطبيقات Azure Mobile ل Xamarin.Android. تسمح المزامنة في وضع عدم الاتصال للمستخدمين النهائيين بالتفاعل مع تطبيق جوال - عرض البيانات أو إضافتها أو تعديلها - حتى في حالة عدم وجود اتصال بالشبكة. يتم تخزين التغييرات في قاعدة بيانات محلية. بمجرد عودة الجهاز إلى الاتصال بالإنترنت، تتم مزامنة هذه التغييرات مع الخدمة عن بعد.

في هذا البرنامج التعليمي، يمكنك تحديث مشروع العميل من البرنامج التعليمي إنشاء تطبيق Xamarin Android لدعم الميزات غير المتصلة بالإنترنت لتطبيقات Azure للأجهزة المحمولة. إذا لم تستخدم مشروع خادم البدء السريع الذي تم تنزيله، فيجب إضافة حزم ملحق الوصول إلى البيانات إلى مشروعك. لمزيد من المعلومات حول حزم ملحقات الخادم، راجع العمل مع حزمة SDK لخادم الواجهة الخلفية .NET لتطبيقات Azure للأجهزة المحمولة.

لمعرفة المزيد حول ميزة المزامنة دون اتصال، راجع الموضوع مزامنة البيانات دون اتصال في Azure Mobile Apps.

تحديث تطبيق العميل لدعم الميزات غير المتصلة بالإنترنت

تتيح لك ميزات Azure Mobile App غير المتصلة بالإنترنت التفاعل مع قاعدة بيانات محلية عندما تكون في سيناريو غير متصل بالإنترنت. لاستخدام هذه الميزات في تطبيقك، يمكنك تهيئة SyncContext إلى متجر محلي. ثم قم بالرجوع إلى جدولك من خلال واجهة iObileServiceSyncTable . يتم استخدام SQLite كمتجر محلي على الجهاز.

  1. في Visual Studio، افتح مدير حزم NuGet في المشروع الذي أكملته في البرنامج التعليمي لإنشاء تطبيق Xamarin Android. ابحث عن حزمة NuGet من Microsoft.Azure.Mobile.Client.SQLiteStore وقم بتثبيتها.
  2. افتح ملف ToDoActivity.cs وقم بإلغاء التعليق على التعريف #define OFFLINE_SYNC_ENABLED .
  3. في Visual Studio، اضغط على المفتاح F5 لإعادة إنشاء تطبيق العميل وتشغيله. يعمل التطبيق بنفس الطريقة التي كان يعمل بها قبل تمكين المزامنة في وضع عدم الاتصال. ومع ذلك، يتم الآن تعبئة قاعدة البيانات المحلية بالبيانات التي يمكن استخدامها في سيناريو غير متصل.

تحديث التطبيق لقطع الاتصال بالواجهة الخلفية

في هذا القسم، يمكنك قطع الاتصال بالواجهة الخلفية لتطبيق الجوال لمحاكاة موقف غير متصل بالإنترنت. عند إضافة عناصر بيانات، يخبرك معالج الاستثناءات بأن التطبيق في وضع عدم الاتصال. في هذه الحالة، تتم إضافة عناصر جديدة في المتجر المحلي ويتم مزامنتها مع الواجهة الخلفية لتطبيق الأجهزة المحمولة عند تنفيذ دفعة في حالة اتصال.

  1. تحرير ToDoActivity.cs في المشروع المشترك. تغيير عنوان URL للتطبيق للإشارة إلى عنوان URL غير صالح:

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

    يمكنك أيضا إظهار السلوك في وضع عدم الاتصال عن طريق تعطيل شبكة wifi والشبكات الخلوية على الجهاز أو استخدام وضع الطائرة.

  2. اضغط على F5 لإنشاء التطبيق وتشغيله. لاحظ فشل المزامنة عند التحديث عند تشغيل التطبيق.

  3. أدخل عناصر جديدة ولاحظ فشل الدفع بحالة [CancelledByNetworkError] في كل مرة تنقر فيها فوق حفظ. ومع ذلك ، توجد عناصر todo الجديدة في المتجر المحلي حتى يمكن دفعها إلى الواجهة الخلفية لتطبيق الجوال. في تطبيق إنتاج، إذا قمت بمنع هذه الاستثناءات، فسيتصرف تطبيق العميل كما لو كان لا يزال متصلا بالواجهة الخلفية لتطبيق الجوال.

  4. أغلق التطبيق وأعد تشغيله للتحقق من استمرار العناصر الجديدة التي أنشأتها في المتجر المحلي.

  5. (اختياري) في Visual Studio، افتح "مستكشف الخادم". انتقل إلى قاعدة البيانات الخاصة بك في قواعد بياناتAzure-SQL>. انقر بزر الماوس الأيمن فوق قاعدة البيانات وحدد فتح في SQL Server مستكشف الكائنات. يمكنك الآن الاستعراض للوصول إلى جدول قاعدة بيانات SQL ومحتوياته. تحقق من عدم تغيير البيانات الموجودة في قاعدة البيانات الخلفية.

  6. (اختياري) استخدم أداة REST مثل Fiddler أو Postman للاستعلام عن الواجهة الخلفية للجوال ، باستخدام استعلام GET في النموذج https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.

قم بتحديث التطبيق لإعادة توصيل الواجهة الخلفية لتطبيق الجوال

في هذا القسم، أعد توصيل التطبيق بالواجهة الخلفية لتطبيق الجوال. عند تشغيل التطبيق لأول مرة، يقوم معالج الأحداث باستدعاء OnCreateOnRefreshItemsSelected. تستدعي SyncAsync هذه الطريقة مزامنة متجرك المحلي مع قاعدة البيانات الخلفية.

  1. افتح ToDoActivity.cs في المشروع المشترك، وقم بإرجاع التغيير الذي أجريته على خاصية عنوان URL للتطبيق .

  2. اضغط على المفتاح F5 لإعادة إنشاء التطبيق وتشغيله. يقوم التطبيق بمزامنة التغييرات المحلية مع الواجهة الخلفية لتطبيق Azure Mobile App باستخدام عمليات الدفع والسحب عند OnRefreshItemsSelected تنفيذ الطريقة.

  3. (اختياري) عرض البيانات المحدثة باستخدام إما مستكشف الكائنات SQL Server أو أداة REST مثل Fiddler. لاحظ أنه تمت مزامنة البيانات بين قاعدة بيانات الواجهة الخلفية لتطبيق Azure Mobile App والمتجر المحلي.

  4. في التطبيق، انقر فوق خانة الاختيار الموجودة بجانب بعض العناصر لإكمالها في المتجر المحلي.

    CheckItem مكالمات SyncAsync لمزامنة كل عنصر مكتمل مع الواجهة الخلفية لتطبيق الجوال. SyncAsync يدعو كل من الدفع والسحب. كلما قمت بتنفيذ عملية سحب على جدول قام العميل بإجراء تغييرات عليه، يتم تنفيذ عملية سحب دائما تلقائيا. وهذا يضمن بقاء جميع الجداول في المتجر المحلي إلى جانب العلاقات متسقة. قد يؤدي هذا السلوك إلى دفعة غير متوقعة. لمزيد من المعلومات حول هذا السلوك، راجع مزامنة البيانات دون اتصال في Azure Mobile Apps.

مراجعة رمز مزامنة العميل

يحتوي مشروع عميل Xamarin الذي قمت بتنزيله عند الانتهاء من البرنامج التعليمي إنشاء تطبيق Xamarin Android بالفعل على تعليمات برمجية تدعم المزامنة في وضع عدم الاتصال باستخدام قاعدة بيانات SQLite محلية. فيما يلي نظرة عامة موجزة على ما تم تضمينه بالفعل في رمز البرنامج التعليمي. للحصول على نظرة عامة مفاهيمية حول الميزة، راجع مزامنة البيانات دون اتصال في Azure Mobile Apps.

  • قبل إجراء أي عمليات جدول، يجب تهيئة المتجر المحلي. تتم تهيئة قاعدة بيانات المتجر المحلي عند ToDoActivity.OnCreate() التنفيذ ToDoActivity.InitLocalStoreAsync(). تقوم هذه الطريقة بإنشاء قاعدة بيانات SQLite محلية باستخدام MobileServiceSQLiteStore الفئة التي توفرها مجموعة SDK لعميل Azure Mobile Apps.

    تقوم DefineTable الطريقة بإنشاء جدول في المتجر المحلي يطابق الحقول في النوع المتوفر، ToDoItem في هذه الحالة. لا يلزم أن يتضمن النوع كافة الأعمدة الموجودة في قاعدة البيانات البعيدة. من الممكن تخزين مجموعة فرعية فقط من الأعمدة.

      // 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);
      }
    
  • toDoTable عضو من ToDoActivity النوع IMobileServiceSyncTable بدلا من IMobileServiceTable. يقوم IMobileServiceSyncTable بتوجيه كافة عمليات إنشاء وقراءة وتحديث وحذف جدول (CRUD) إلى قاعدة بيانات المتجر المحلي.

    يمكنك تحديد متى يتم دفع التغييرات إلى الواجهة الخلفية لتطبيق Azure Mobile عن طريق الاتصال IMobileServiceSyncContext.PushAsync(). يساعد سياق المزامنة في الحفاظ على علاقات الجداول من خلال تعقب التغييرات ودفعها في جميع الجداول التي قام تطبيق العميل بتعديلها عند PushAsync استدعائها.

    يستدعي ToDoActivity.SyncAsync() الرمز المقدم المزامنة كلما تم تحديث قائمة todoitem أو تمت إضافة todoitem أو إكماله. تتم مزامنة الرمز بعد كل تغيير محلي.

    في التعليمة البرمجية المقدمة ، يتم الاستعلام عن جميع السجلات الموجودة في الجدول البعيد TodoItem ، ولكن من الممكن أيضا تصفية السجلات عن طريق تمرير معرف استعلام واستعلام إلى PushAsync. لمزيد من المعلومات، راجع القسم المزامنة التزايدية في مزامنة البيانات دون اتصال في تطبيقات Azure للأجهزة المحمولة.

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

الموارد الإضافية