Swift (iOS/macOS) के लिए ORM: तुलना और उदाहरण
\n\niOS और macOS के लिए एप्लिकेशन विकसित करते समय, स्थानीय डेटा के साथ काम करना एक प्रमुख कार्य है। Object-Relational Mapping (ORM) डेवलपर्स को कच्चे SQL क्वेरी लिखने के बजाय, ऑब्जेक्ट-ओरिएंटेड दृष्टिकोण का उपयोग करके डेटाबेस के साथ काम करने की अनुमति देता है। इस लेख में, हम Swift के लिए चार मुख्य ORM समाधानों पर विचार करेंगे: Core Data, Realm, GRDB और SwiftData। आप उनकी ताकत और कमजोरियों को जानेंगे, साथ ही प्रत्येक तकनीक के लिए कोड उदाहरण भी देखेंगे।
\n\n1. Core Data
\n\nCore Data Apple का एक फ्रेमवर्क है, जो iOS, macOS, tvOS और watchOS में निर्मित है। यह शुद्ध ORM नहीं है (बल्कि, persistence framework है), लेकिन ORM के सभी कार्य करता है: ऑब्जेक्ट मॉडल प्रबंधन, सहेजना, परिवर्तनों को पूर्ववत करना और NSFetchedResultsController के माध्यम से UI से जुड़ना।
\n\nलाभ:
\n- \n
- Apple इकोसिस्टम (iCloud, SwiftUI, Combine) के साथ गहरा एकीकरण \n
- डेटा वर्जनिंग और माइग्रेशन के लिए अंतर्निहित समर्थन \n
- शक्तिशाली प्रेडिकेट और सॉर्टिंग \n
नुकसान:
\n- \n
- जटिल सेटअप और बहुत सारा boilerplate कोड \n
- मल्टीथ्रेडिंग के साथ समस्याएं (सख्त संदर्भ की आवश्यकता) \n
- बड़े डेटा वॉल्यूम पर कम प्रदर्शन \n
उपयोग का उदाहरण:
\nimport CoreData\n\n// 1. मॉडल बनाएँ (Xcode Data Model Editor में)\n// 2. कंटेनर को इनिशियलाइज़ करें\nlet container = NSPersistentContainer(name: "MyModel")\ncontainer.loadPersistentStores { _, error in\n if let error = error { fatalError("Failed to load: \\(error)") }\n}\n\n// 3. ऑब्जेक्ट सहेजें\nlet context = container.viewContext\nlet user = User(context: context)\nuser.name = "इवान"\nuser.age = 30\ntry? context.save()\n\n// 4. क्वेरी\nlet request: NSFetchRequest<User> = User.fetchRequest()\nrequest.predicate = NSPredicate(format: "age > %@", 18)\nlet adults = try? context.fetch(request)\n\n\n2. Realm
\n\nRealm एक लोकप्रिय तृतीय-पक्ष ORM है, जो मोबाइल प्लेटफॉर्म के लिए बनाया गया है। यह अधिकांश परिदृश्यों में Core Data से तेज़ काम करता है और उपयोग में सरल है। Realm SQLite के बजाय अपने स्वयं के स्टोरेज इंजन का उपयोग करता है।
\n\nलाभ:
\n- \n
- उच्च पढ़ने/लिखने की गति \n
- सरल API (कोई NSManagedObject नहीं) \n
- रिएक्टिव अपडेट के लिए अंतर्निहित समर्थन (Realm Notifications के माध्यम से) \n
नुकसान:
\n- \n
- बंद कोड (पूर्ण अर्थों में ओपन-सोर्स नहीं) \n
- मॉडल बदलने पर माइग्रेशन में समस्याएं \n
- जटिल क्वेरी (JOIN, उप-क्वेरी) के लिए सीमित समर्थन \n
उपयोग का उदाहरण:
\nimport RealmSwift\n\n// 1. मॉडल परिभाषित करें\nclass User: Object {\n @Persisted var name: String = ""\n @Persisted var age: Int = 0\n}\n\n// 2. बनाएँ और सहेजें\nlet realm = try! Realm()\nlet user = User()\nuser.name = "मारिया"\nuser.age = 25\ntry! realm.write {\n realm.add(user)\n}\n\n// 3. क्वेरी\nlet adults = realm.objects(User.self).filter("age > 18")\n\n\n3. GRDB
\n\nGRDB Swift के लिए एक हल्का ORM है, जो SQLite के ऊपर बनाया गया है। यह SQL क्वेरी पर पूर्ण नियंत्रण देता है, लेकिन साथ ही एक सुविधाजनक ऑब्जेक्ट-ओरिएंटेड इंटरफ़ेस प्रदान करता है। GRDB विशेष रूप से उन डेवलपर्स के बीच लोकप्रिय है जो SQL की शक्ति को Swift की सुविधा के साथ जोड़ना चाहते हैं।
\n\nलाभ:
\n- \n
- SQL तक पूर्ण पहुंच (जटिल क्वेरी लिख सकते हैं) \n
- उच्च प्रदर्शन (शुद्ध SQLite के करीब) \n
- Swift Concurrency (async/await) के लिए समर्थन \n
नुकसान:
\n- \n
- SQL का ज्ञान आवश्यक \n
- Core Data की तुलना में कम दस्तावेज़ीकरण \n
- iCloud के लिए कोई अंतर्निहित समर्थन नहीं \n
उपयोग का उदाहरण:
\nimport GRDB\n\n// 1. मॉडल परिभाषित करें (Codable + FetchableRecord)\nstruct User: Codable, FetchableRecord, PersistableRecord {\n var id: Int64?\n var name: String\