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

نظرة عامة

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

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

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

تمكين وظيفة المزامنة في وضع عدم الاتصال في حل التشغيل السريع

يتم تضمين التعليمات البرمجية للمزامنة دون اتصال في المشروع باستخدام توجيهات المعالج المسبق C #. عند تعريف رمز OFFLINE_SYNC_ENABLED، يتم تضمين مسارات التعليمات البرمجية هذه في الإنشاء. للحصول على Windows التطبيقات ، يجب عليك أيضا تثبيت النظام الأساسي SQLite.

  1. في Visual Studio، انقر بزر الماوس الأيمن فوق الحل إدارة حزم NuGet للحلول...، ثم ابحث عن حزمة Microsoft.Azure.Mobile.Client.SQLiteStore NuGet وتثبيتها لجميع المشاريع في الحل>.

  2. في مستكشف الحلول، افتح ملف TodoItemManager.cs من المشروع مع Portable في الاسم، وهو مشروع مكتبة الفئة المحمولة، ثم قم بإلغاء التعليق على توجيه المعالج المسبق التالي:

     #define OFFLINE_SYNC_ENABLED
    
  3. (اختياري) لدعم أجهزة Windows، قم بتثبيت إحدى حزم وقت تشغيل SQLite التالية:

    • Windows 8.1 وقت التشغيل: تثبيت SQLite ل Windows 8.1.

    • Windows Phone 8.1: تثبيت SQLite ل Windows Phone 8.1.

    • النظام الأساسي العام لـ Windows تثبيت SQLite ل Universal Windows Universal.

      على الرغم من أن البداية السريعة لا تحتوي على مشروع Windows عالمي، إلا أن النظام الأساسي Windows العالمي مدعوم بنماذج Xamarin.

  4. (اختياري) في كل مشروع تطبيق Windows، انقر بزر الماوس الأيمن فوق مراجعإضافة>مرجع...، وقمبتوسيع ملحقات المجلد > Windows. قم بتمكين SQLite المناسب ل SDK Windows جنبا إلى جنب مع Visual C++ 2013 وقت تشغيل Windows SDK. تختلف أسماء SQLite SDK قليلا مع كل Windows النظام الأساسي.

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

فيما يلي نظرة عامة موجزة على ما تم تضمينه بالفعل في رمز البرنامج التعليمي داخل التوجيهات #if OFFLINE_SYNC_ENABLED . توجد وظيفة المزامنة دون اتصال في ملف المشروع TodoItemManager.cs في مشروع مكتبة الفئات المحمولة. للحصول على نظرة عامة مفاهيمية حول الميزة، راجع مزامنة البيانات دون اتصال في Azure Mobile Apps.

  • قبل إجراء أي عمليات جدول، يجب تهيئة المتجر المحلي. تتم تهيئة قاعدة بيانات المتجر المحلي في منشئ الفئة TodoItemManager باستخدام التعليمة البرمجية التالية:

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

    تقوم هذه التعليمة البرمجية بإنشاء قاعدة بيانات SQLite محلية جديدة باستخدام فئة MobileServiceSQLiteStore .

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

  • الحقل todoTable في TodoItemManager هو نوع IMobileServiceSyncTable بدلا من IMobileServiceTable. تستخدم هذه الفئة قاعدة البيانات المحلية لكافة عمليات إنشاء وقراءة وتحديث وحذف جدول (CRUD). يمكنك تحديد متى يتم دفع هذه التغييرات إلى الواجهة الخلفية لتطبيق الجوال عن طريق الاتصال ب PushAsync على iObileServiceSyncContext. يساعد سياق المزامنة في الحفاظ على علاقات الجداول من خلال تتبع التغييرات ودفعها في جميع الجداول التي قام تطبيق العميل بتعديلها عند استدعاء PushAsync .

    يتم استدعاء طريقة 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"]);
              }
          }
      }
    

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

اعتبارات المزامنة في وضع عدم الاتصال

في النموذج، يتم استدعاء أسلوب SyncAsync فقط عند بدء التشغيل وعند طلب مزامنة. لبدء مزامنة في تطبيق Android أو iOS، اسحب لأسفل في قائمة العناصر؛ للحصول على Windows، استخدم الزر مزامنة. في تطبيق في العالم الحقيقي ، يمكنك أيضا تشغيل تشغيل المزامنة عند تغيير حالة الشبكة.

عندما يتم تنفيذ سحب مقابل جدول يحتوي على تحديثات محلية معلقة يتم تعقبها بواسطة السياق، تقوم عملية السحب هذه تلقائيا بتشغيل دفعة سياق سابقة. عند تحديث العناصر وإضافتها وإكمالها في هذا النموذج، يمكنك حذف مكالمة PushAsync الصريحة.

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

تشغيل تطبيق العميل

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

تحديث سلوك المزامنة لتطبيق العميل

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

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

     public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
    
  2. افتح ملف TodoItemManager .cs من المشروع المحمول ، ثم أضف صيدا لفئة الاستثناء الأساسية إلى التجربة ... قبض على كتلة في SyncAsync. تكتب كتلة الصيد هذه رسالة الاستثناء إلى وحدة التحكم، كما يلي:

         catch (Exception ex)
         {
             Console.Error.WriteLine(@"Exception: {0}", ex.Message);
         }
    
  3. إنشاء تطبيق العميل وتشغيله. إضافة بعض العناصر الجديدة. لاحظ أنه يتم تسجيل استثناء في وحدة التحكم لكل محاولة للمزامنة مع الواجهة الخلفية. توجد هذه العناصر الجديدة فقط في المتجر المحلي حتى يمكن دفعها إلى الواجهة الخلفية للجوال. يتصرف تطبيق العميل كما لو كان متصلا بالواجهة الخلفية ، مما يدعم جميع عمليات الإنشاء والقراءة والتحديث والحذف (CRUD).

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

  5. (اختياري) استخدم Visual Studio لعرض جدول قاعدة بيانات Azure SQL للتأكد من أن البيانات الموجودة في قاعدة البيانات الخلفية لم تتغير.

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

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

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

  1. إعادة فتح الثوابت.cs. صحح applicationURL الإشارة إلى عنوان URL الصحيح.

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

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

    لاحظ أنه تمت مزامنة البيانات بين قاعدة البيانات والمتجر المحلي وتحتوي على العناصر التي أضفتها أثناء قطع اتصال تطبيقك.

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