دليل المبتدئين للCoreData باستخدام Swift 4

Ammar AlTahhanمنذ 7 سنوات

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

 

هذه المقالة ستتحدث عن الCoredata، كدليل لمن لم يستخدم ال Coredata ابدا من قبل.

سننشئ تطبيق to-do بسيط لشرح كيفية استخدام الCoredata

 

لماذا الCoredata؟

يتم استخدام ال Coredata لحفظ بيانات الObjects على الجهاز لاستعادتها لاحقا بعد اغلاق التطبيق/الجهاز وهو ما يعرف بـ Persistence Data

هناك مزايا للCoredata كامكانية التعديل على الrecords والفلترة والPartial Loading عكس الUserDefaults

وصحيح أن هناك frameworks أخرى تقدم ميزة حفظ البيانات locally (مثل مكتبة Realm على سبيل المثال) لكننا لن نتطرق للفروقات بينهما و سنتحدث فقط عن الCoredata

 

ماذا ستتعلم هنا؟

في دليل المبتدئين لن نغوص عميقا في الCoredata، لكنك ستتعلم كيفية حفظ، استعادة، وحذف البيانات.

سأفترض بأنك على معرفة بالdelegates, optionals وكيفية انشاء UITableView بسيط

ان لم تكن على علم بها أو ان اردت مراجعة هذه المفاهيم ستجدها في المواضيع التالية:

 

واجهة المستخدم

في هذا الدليل سنقوم بانشاء to-do-app بسيط يتكون من واجهتين، الأولى تتكون من UITableView فقط لعرض المهام المضافة

والثانية ستسخدم لاضافة المهام تحتوي على UITextField لادخال نص المهمة وUIButton لحفظ المهمة والعودة للواجهة السابقة

59dfa4f0ddbdc_ScreenShot2017-10-12at8_11_04PM.thumb.png.8abf2936605a56842b469724881d0c28.png

 

بداية

عندما تقوم بانشاء المشروع لأول مرة، تأكد من اختيار Use Core Data 

59dfa4331eee9_ScreenShot2017-10-12at7_17_55PM.thumb.png.bfb8bd8b60e6ed452288be1b62732991.png

 

عند انشاء المشروع ستلاحظ وجود ملف جديد xcdatamodeld.

هذا الملف كال Spreadsheet سيستعمل لانشاء مودل للبيانات التي نرغب بتخزينها

اضغط على الملف الجديد واضف Task كEntity وname كAttribute من نوع String

59dfa43cd49ab_ScreenShot2017-10-12at7_36_20PM.thumb.png.43bf2eea7e233cf46ca874dc08650e73.png

 

سنبدأ بحفظ البيانات في الواجهة الثانية  AddTask

للقيام بذلك يجب أن نحصل على access للCoredata Stack

هناك كلمتين مخيفتين عليك تذكرهما جيدا، NSPersistentContainer و NSManagedObjectContext

يمكنك التفكير بال Container كالصندوق الذي سنحتفظ فيه بالبيانات، والContext كفتحة الصندوق التي سنستطيع من خلالها اضافة، استرجاع وحذف البيانات

بالمناسبة، في الAppDelegate.swift ستجد العديد من الميثودز والخصائص المتعلقة بالCoredata، كل ماعلينا عمله هو استخدامها

 

في الواجهة الثانية سنضيف الكود التالي

59dfa4414dcc7_ScreenShot2017-10-12at7_47_48PM.thumb.png.23ba55cfb33168357a47e3e30c8f8570.png

 

1/ في هذا السطر قمنا بانشاء reference للContext (الصندوق) لنقوم بالتخزين فيه

2/ قمنا بتحديد نوع البيانات التي نريد تخزينها (من نوع Task Entity) وقمنا بتحديد الname المراد تخزينه

3/ طلبنا من الContext حفظ البيانات التي تم ادخالها. (بما أن الTask Entity تم ربطها بالContext فسيقوم الContext بحفظها)

4/ سنعود للواجهة الأولى لعرض المهمات

 

الآن لعرض المهمات سنضيف الكود التالي للواجهة الأولى


class TasksTable: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext //1
    
    var tasks: [Task] = [] //2
    
    override func viewDidLoad() { //3
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    }
    
    override func viewWillAppear(_ animated: Bool) { //4
        getData()
        tableView.reloadData()
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { //5
        return tasks.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { //5
        let cell = UITableViewCell()
        
        let task = tasks[indexPath.row]
        
        if let myName = task.name {
            cell.textLabel?.text = myName
        }
        
        return cell
    }
    
    func getData() { //6
        do {
            tasks = try context.fetch(Task.fetchRequest())
        }
        catch {
            print("Fetching Failed")
        }
    }
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { //7
        if editingStyle == .delete {
            let task = tasks[indexPath.row]
            context.delete(task)
            (UIApplication.shared.delegate as! AppDelegate).saveContext()
            
            do {
                tasks = try context.fetch(Task.fetchRequest())
            }
            catch {
                print("Fetching Failed")
            }
        }
        tableView.reloadData()
    }


}

 

سنقوم بشرح الكود السابق بالتفصيل

1/ قمنا بانشاء reference لل Context في أعلى الكلاس لنستخدمه عند الحاجة في الميثودز المختلفة

2/ قمنا بانشاء Array مؤقتة لتخزين البيانات المجلوبة من الContext وعرضها في الجدول

3/ في الViewDidLoad قمنا بتحديد الواجهة الحالية ك Delegate و DataSource للجدول

4/ في الViewWillAppear قمنا باستدعاء الميثود ()getData لجلب البيانات باستخدام الContext وتحديث الجدول لعرضها

5/ في الميثودين numberOfRowsInSection و cellForRowAt indexPath قمنا بانشاء الجدول وعرض الخلايا بالبيانات المطلوبة

6/ في الميثود getData قمنا بطلب fetch من الContext وقمنا بتحديد الTask Entity للحصول على آخر نسخة من بياناتها

    هذا الاستدعاء يجب أن يكون متضمن داخل do-catch block 

7/ في الميثود editingStyle الخاصة بالجدول قمنا باضافة ميزة السحب للحذف (كالتالي)

59dfa4428685b_ScreenShot2017-10-12at8_14_26PM.png.39e749ff454d64ef41e661eff93d370d.png

     واستخدمنا الميثود ()context.delete لحذف الtask التي تم اختيارها ثم قمنا باعادة استدعاء البيانات من جديد وتحديث الجدول لعرضها

 

النتيجة النهائية للتطبيق

Webp.net-gifmaker.gif.1544edf3bed6e33ecaa342e1216a374a.gif

 

ونصل هنا الى ختام مقالتنا

أستودعكم الله الذي لا تضيع ودائعه

كلمات دليلية:
2
إعجاب
3538
مشاهدات
1
مشاركة
1
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !