Data Persistant !

السلام عليكم ورحمة الله وبركاته ..

يتردد لدى البعض سؤال متكرر عند بناءه لتطبيق ويكون الغاية من هذا التطبيق حفظ بعض البيانات لحفظ الوقت وتوفيرها لمستخدم التطبيق بشكل سريع ..

أكثر سؤال كان يصلني مؤخراً هو كالتالي لدي بعض البيانات و أود حفظها بالجهاز .. كيييف؟

بالحديث عن هذا الموضوع :

سأقوم بالحديث عن بعض الادوات او التقنيات التي تساعدك في حفظ البيانات على الجهاز وتساعدك للتأكد من وجود البيانات على الجهاز عند حاجة المستخدم للرجوع لها بشكل مباشر وسريع "ربما حفظ للوقت او لتخفيف الحمل على السيرفر" ..

Archiving:

هذا النوع او الطريقة ربما شاهدتها عند إنشاءك لـ ViewController او خلافه وهي ليست مستخدمه في حفظ البيانات على مستوى التطبيقات لـ بيانات المستخدم وما الى ذلك لكنها مستخدمه من قبل النظام عن طريق حفظ ملفات Xib او Storyboards بحيث يتم حفظ التسلسل الهرمي للواجهات" اذا صحت الترجمة لـ View Hierarchy ههه" ..

وطريقة الحفظ تكون على شكل Graph object ولكن بطريقة مخصصه لها .. ربما تكون قد شاهدت عملية الحفظ بالشكل التالي ..

init(coder: #value#)  
encode(data: #value#)  
NSUserDefaults/UserDefaults (renamed to in Swift 3.0):

وهي عبارة عن class تم توفيره من ابل لحفظ البيانات ذات حجم خفيف للتعامل معها بشكل سريع مثل ملفات الإعدادات البسيطة ..

  • يتم حفظ البياانات فيها على شكل .plist
  • هي plist مكونه من Dictionary تحتوي على مجموعة من الـ key وما يقابلها من بيانات .. وهذه البيانات قد تكون Number , String Dictionary , Array … "الانواع ثابته"
  • حجم البيانات التي يمكن حفظها محدود بشكل تقريبي !

المشكلة في التعامل مع UserDefaults ربما ذكرتها في النقطة الأخيرة هو كمية البيانات التي يمكن يحفظها .. فينصح بحفظ البيانات كأقصى حجم أن لا يتعدى ٥٠٠ كيلو بايت والبعض يقول ان لا تصل إلى ١ ميجا بايت “لم اجد من يؤكد المعلومة لكن أميل إلي اعتماد المعلومة الأولي (٥٠٠كيلوبايت) بحسب معلومة ذكرت عرضيا في محاضرة مقدمة في جامعة ستانفورد

مثال لنوع بيانات او استخدامات مع الـ UserDefaults :

  • تحديد الـ mode للتطبيق سواء ليلي او صباحي "عجزت اجيبها بشكل افضل ههه"
  • تحديد ما اذا كان المستخدم لأول مره يقوم باستخدام التطبيق او لا
  • تحديد ما اذا كان المستخدم قد قام بمشاهدة المقدمة التعريفية للتطبيق او لا

بالحديث عن هذا الموضوع يقودنا الى التالي وهو ماذا لو كانت البيانات التي يقوم بحفظها أو إنشاءها المستخدم ذات حجم كبير ؟ ماذا افعل .!؟

واقصد بحجم كبير وهو لو كان لديك تطبيق يقوم المستخدم من خلاله بإنشاء الصور واضافات التعليات عليها ويتم تخزينها في الجهاز للذكرى .. ! ماذا ستفعل ..!؟ هل ستقوم بحفظها بـ User Defaults ؟ طبعاً لا !

SQLlite:

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

  • التعامل معها آمن على مستوى اكثر من threads
  • بامكانك تخزين البيانات في جدول واحد او اكثر وبامكانك عمل بعض الـ realtions بينها ..

نقطة أخيرة ومهمة ! وهي ان قاعدة البيانات عبارة عن ملف واحد ,غالبا ما يكون امتداده من نوع .sqlite .

بامكانك التعامل معها في تطبيق اما بشكل مباشر أو استخدام احدى المكتبات التي قد تساعدك في ذلك مثل FMDB

iOS File System:

نعلم ان نظام iOS مبني على Unix file system ولها اعتبارات خاصة فيه "لست متخصصاً بالحديث عن تفاصيل هذا الموضوع" ..

وعند تعاملك مع الملفات فغالباً ما يكون وصولك مخصص بالـ sandbox او المنطقة المخصصة للتطبيق "يستثنى من ذلك الجلبريك واموره وله تفاصيله الخاصة به" ..

فبإمكان إضافة مجموعة من الملفات وحذفها عن طريق استخدام FileManage او NSFileManager "وهما نفس الشيء ولكن فرق التسمية راجعه لـ Swift 3 كذلك" وعند الحديث عن الوصول فلا يمكنك الوصول لكل الملفات المتواجدة في النظام وربما الاكثر استخداما هو ملفات Documents و Cache .

وعند حذف التطبيق سيتم حذف جميع الملفات التي ستكون في هذه المنطقة ..

Core Data:

قبل أن أبدا بشرحها CoreData ليست Database .. ممتاز .. !!؟ الان نبدأ الشرح .. :)

هي طريقة لحفظ البيانات عن طريق الـ Object ومستخدمه بكثره على نظام الـ iOS في حفظ البيانات وتعديلها وما إلى ذلك ..

ومن الممكن استخدامها مع ملفات XML وكذلك مع الـ SQLlite وكذلك بامكانك استخدامها على ملفات مخصصه لك ان احببت "لا علم لدي بطريقة دعم ملفات مخصصة لك".

كيف تعمل .. ؟

تقوم بعمل schema لمشروعك عن طريق الـ visual tool الموفرة من ابل .. بامكانك التعامل معها عن طريق visual mapping او انشاءها بـ استخدام entity & attribute ..

لن أخوض ب تفاصيل التعامل معها بالوقت الحالي أو ربما لاحقا

Realm:

انتشر مؤخرا التعامل مع Realm كـ قاعدة بيانات للهواتف الذكية .. طبعا حسب ما قرأت انها أسرع من الـ SQLlite ك قاعدة بيانات وأفضل من ناحية الأداء "لم أقم بتجارب على هذا الشيء" ..

الجميل بالموضوع هو عملية التعامل معها واستخدامها من حيث الإضافة والحذف والتعديل ..الخ هي ليست كباقي قواعد البيانات بحيث ان المستخدم عندما يقوم بالاستعلام عن مجموعة من البيانات فهو فعليا يقوم بالتعامل مع الـ actual records أي البيانات نفسها وليس نسخة من هذه البيانات وثم يقوم بعمل التعديل وعمل التحديث عليها مباشرة …

طبعا Realm أتت بأكثر من شكل وبأكثر من استخدام ومفهوم .. وربما لو قمت بـ زيارة موقعهم ستجد الاسلوب والطريقة التي قاموا بتقديمها ..

الخلاصة :

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

أسعد بإضافتك على هذه المقالة في حال نسياني لإحدى المعلومات المهمة أو لم أوفها حقها .. وتصحيحي إن أخطأت ..

حسابي : @SalehAlDhobaie

وبس ,