ORM لـ Swift (iOS/macOS): مقارنة وأمثلة
عند تطوير تطبيقات iOS وmacOS، يُعد العمل مع البيانات المحلية من المهام الأساسية. يتيح Object-Relational Mapping (ORM) للمطورين العمل مع قواعد البيانات باستخدام نهج كائني التوجه بدلاً من كتابة استعلامات SQL الخام. في هذه المقالة، سنستعرض أربعة حلول ORM رئيسية لـ Swift: Core Data, Realm, GRDB وSwiftData. ستتعرف على نقاط القوة والضعف لكل منها، وسترى أمثلة كود لكل تقنية.
1. Core Data
Core Data هو إطار عمل من Apple مدمج في iOS وmacOS وtvOS وwatchOS. ليس ORM خالصًا (بل هو إطار عمل للاستمرارية)، لكنه يؤدي جميع وظائف ORM: إدارة النموذج الكائني، الحفظ، التراجع عن التغييرات، والربط مع واجهة المستخدم عبر NSFetchedResultsController.
المزايا:
- تكامل عميق مع نظام Apple البيئي (iCloud, SwiftUI, Combine)
- دعم مدمج للتحكم في الإصدارات وترحيل البيانات
- مسندات وفرز قوية
العيوب:
- إعداد معقد والكثير من الكود التكراري (boilerplate)
- مشاكل في تعدد المهام (يتطلب سياقًا صارمًا)
- أداء منخفض مع كميات كبيرة من البيانات
مثال استخدام:
import CoreData
// 1. إنشاء النموذج (في Xcode Data Model Editor)// 2. تهيئة الحاويةlet container = NSPersistentContainer(name: "MyModel")container.loadPersistentStores { _, error in if let error = error { fatalError("فشل التحميل: \\(error)") }}
// 3. حفظ الكائنlet context = container.viewContextlet user = User(context: context)user.name = "إيفان"user.age = 30try? context.save()
// 4. الاستعلامlet request: NSFetchRequest<User> = User.fetchRequest()request.predicate = NSPredicate(format: "age > %@", 18)let adults = try? context.fetch(request)2. Realm
Realm هو ORM طرف ثالث شهير، صُمم للمنصات المحمولة. يعمل بشكل أسرع من Core Data في معظم السيناريوهات وأسهل في الاستخدام. يستخدم Realm محرك تخزين خاص به بدلاً من SQLite.
المزايا:
- سرعة عالية في القراءة/الكتابة
- API بسيط (بدون NSManagedObject)
- دعم مدمج للتحديثات التفاعلية (عبر Realm Notifications)
العيوب:
- كود مغلق (ليس مفتوح المصدر بالكامل)
- مشاكل في الترحيل عند تغيير النموذج
- دعم محدود للاستعلامات المعقدة (JOIN, استعلامات فرعية)
مثال استخدام:
import RealmSwift
// 1. تعريف النموذجclass User: Object { @Persisted var name: String = "" @Persisted var age: Int = 0}
// 2. إنشاء وحفظlet realm = try! Realm()let user = User()user.name = "ماريا"user.age = 25try! realm.write { realm.add(user)}
// 3. الاستعلامlet adults = realm.objects(User.self).filter("age > 18")3. GRDB
GRDB هو ORM خفيف لـ Swift، مبني فوق SQLite. يمنحك تحكمًا كاملاً في استعلامات SQL مع توفير واجهة كائنية مريحة. يحظى GRDB بشعبية خاصة بين المطورين الذين يرغبون في الجمع بين قوة SQL وسهولة Swift.
المزايا:
- وصول كامل إلى SQL (يمكن كتابة استعلامات معقدة)
- أداء عالٍ (قريب من SQLite الخام)
- دعم Swift Concurrency (async/await)
العيوب:
- يتطلب معرفة SQL
- توثيق أقل مقارنة بـ Core Data
- لا يوجد دعم مدمج لـ iCloud
مثال استخدام:
import GRDB
// 1. تعريف النموذج (Codable + FetchableRecord)struct User: Codable, FetchableRecord, PersistableRecord { var id: Int64? var name: String\