ORM لـ Swift (iOS/macOS): مقارنة وأمثلة
عند تطوير تطبيقات iOS وmacOS، غالبًا ما يواجه المطورون الحاجة إلى تخزين البيانات على الجهاز. لتبسيط العمل مع قواعد البيانات، تُستخدم ORM (Object-Relational Mapping) — وهي مكتبات تسمح بالتعامل مع البيانات ككائنات Swift عادية، مع إخفاء تعقيد استعلامات SQL. في هذه المقالة، سنستعرض أربعة حلول شائعة: Core Data، Realm، GRDB و SQLite.swift، ونقارن إمكانياتها ونقدم أمثلة عملية.
1. Core Data
Core Data هو إطار عمل من Apple، مدمج في iOS وmacOS. إنه ليس ORM خالصًا، بل هو إطار عمل لإدارة الرسم البياني للكائنات، يمكنه استخدام SQLite أو XML أو تخزين ثنائي.
المزايا:
- تكامل عميق مع نظام Apple البيئي (SwiftUI, iCloud, Undo Manager).
- محرر مرئي لنموذج البيانات (Xcode Data Modeler).
- دعم التحكم في الإصدارات والترحيل.
العيوب:
- عتبة دخول عالية (الكثير من كود boilerplate).
- مشاكل في الأداء عند العمل مع مجموعات بيانات كبيرة.
- ارتباط صارم بمنصات Apple.
مثال كود (Swift):
import CoreData
// إنشاء السياقlet container = NSPersistentContainer(name: "Model")container.loadPersistentStores { _, error in if let error = error { print(error) }}
// حفظ الكائنlet context = container.viewContextlet user = User(context: context)user.name = "إيفان"user.age = 30
try? context.save()
// استعلامlet request: NSFetchRequest<User> = User.fetchRequest()request.predicate = NSPredicate(format: "age > 18")let users = try? context.fetch(request)2. Realm
Realm هو ORM متعدد المنصات، تم تطويره خصيصًا للتطبيقات المحمولة. إنه أسرع من Core Data في عمليات القراءة والكتابة.
المزايا:
- أداء عالٍ (حتى 10x أسرع من Core Data).
- API بسيط دون الحاجة لكتابة SQL.
- تحديث تلقائي للكائنات (live objects).
- دعم الإضافات التفاعلية (RxRealm, Combine).
العيوب:
- تنسيق ملف قاعدة بيانات مغلق.
- حجم قاعدة بيانات محدود (حتى 2 جيجابايت على iOS).
- مرونة أقل للاستعلامات المعقدة.
مثال كود (Swift):
import RealmSwift
// تعريف النموذجclass User: Object { @Persisted var name: String = "" @Persisted var age: Int = 0}
// حفظlet realm = try! Realm()let user = User()user.name = "ماريا"user.age = 25
try! realm.write { realm.add(user)}
// استعلامlet users = realm.objects(User.self).filter("age > 18")for user in users { print("\\(user.name): \\(user.age)")}3. GRDB
GRDB هي مكتبة حديثة للعمل مع SQLite في Swift. تجمع بين إمكانيات الوصول منخفض المستوى إلى SQL وراحة ORM.
المزايا:
- أقصى أداء (SQLite أصلي).
- دعم Combine و Swift Concurrency (async/await).
- تحكم كامل في استعلامات SQL.
- دعم الترحيل والتحكم في الإصدارات.
العيوب:
- يتطلب معرفة SQL.
- "سحر" أقل — كود يدوي أكثر.
مثال كود (Swift):
import GRDB
// تعريف النموذجstruct User: Codable, FetchableRecord, PersistableRecord { var id: Int64? var name: String var age: Int}
// الاتصال بقاعدة البياناتlet dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")
// حفظtry dbQueue.write { db in let user = User(nam