دليل المبتدئين للCoreData باستخدام Swift 4
السلام عليكم ورحمة الله وبركاته
هذه المقالة ستتحدث عن ال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 لحفظ المهمة والعودة للواجهة السابقة
بداية
عندما تقوم بانشاء المشروع لأول مرة، تأكد من اختيار Use Core Data
عند انشاء المشروع ستلاحظ وجود ملف جديد xcdatamodeld.
هذا الملف كال Spreadsheet سيستعمل لانشاء مودل للبيانات التي نرغب بتخزينها
اضغط على الملف الجديد واضف Task كEntity وname كAttribute من نوع String
سنبدأ بحفظ البيانات في الواجهة الثانية AddTask
للقيام بذلك يجب أن نحصل على access للCoredata Stack
هناك كلمتين مخيفتين عليك تذكرهما جيدا، NSPersistentContainer و NSManagedObjectContext
يمكنك التفكير بال Container كالصندوق الذي سنحتفظ فيه بالبيانات، والContext كفتحة الصندوق التي سنستطيع من خلالها اضافة، استرجاع وحذف البيانات
بالمناسبة، في الAppDelegate.swift ستجد العديد من الميثودز والخصائص المتعلقة بالCoredata، كل ماعلينا عمله هو استخدامها
في الواجهة الثانية سنضيف الكود التالي
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 الخاصة بالجدول قمنا باضافة ميزة السحب للحذف (كالتالي)
واستخدمنا الميثود ()context.delete لحذف الtask التي تم اختيارها ثم قمنا باعادة استدعاء البيانات من جديد وتحديث الجدول لعرضها
النتيجة النهائية للتطبيق
ونصل هنا الى ختام مقالتنا
أستودعكم الله الذي لا تضيع ودائعه
التعليقات (0)
عرض المزيد.. جديد مقالاتي
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !