Core Data — प्रमुख अवधारणाएँ, NSManagedObject और आर्किटेक्चर

लेखक: IT Sectr प्रकाशित: 2026-03-11 पढ़ने का समय: 11 मिनट

Core Data iOS और macOS ऐप्लिकेशन में ऑब्जेक्ट ग्राफ़ प्रबंधित करने के लिए Apple का फ्रेमवर्क है। यह डेटा संरक्षण, परिवर्तन ट्रैकिंग, ऑपरेशन पूर्ववत और NSFetchedResultsController के माध्यम से UI एकीकरण प्रदान करता है। Apple Developer दस्तावेज़ीकरण (2025) के अनुसार, Core Data डेटाबेस नहीं है — यह एक ऑब्जेक्ट मॉडलिंग लेयर है जो डिफ़ॉल्ट रूप से ऑब्जेक्ट लोड और सेव करने के लिए SQLite का उपयोग करता है।

मुख्य बातें

  • Core Data iOS/macOS के लिए एक ORM फ्रेमवर्क है जो ऑब्जेक्ट ग्राफ़ प्रबंधित करता है और उन्हें स्टोर में संग्रहीत करता है।
  • NSManagedObjectModel डेटा स्कीमा है जो Core Data मॉडल में संस्थाओं, गुणों और संबंधों का वर्णन करता है।
  • NSManagedObjectContext परिवर्तन ट्रैकिंग के साथ ऑब्जेक्ट बनाने, पढ़ने, अपडेट करने और हटाने के लिए कार्यक्षेत्र है।
  • NSPersistentContainer iOS 10+ में मॉडल, संदर्भ और स्टोर को समाहित करने वाला एकीकृत प्रवेश बिंदु है।
  • NSFetchedResultsController Core Data को UITableView/UICollectionView के साथ परिवर्तनों पर स्वचालित अपडेट के साथ एकीकृत करता है।

Core Data क्या है?

Core Data एक ऑब्जेक्ट ग्राफ़ प्रबंधन और संरक्षण फ्रेमवर्क है जो Apple के Cocoa Touch SDK का हिस्सा है। यह डेटा के साथ काम करने के लिए ऑब्जेक्ट-ओरिएंटेड इंटरफ़ेस प्रदान करता है: डेवलपर संस्थाओं, गुणों और संबंधों के साथ काम करता है, जबकि Core Data इन ऑब्जेक्ट को रिलेशनल डेटाबेस रिकॉर्ड में बदल देता है।

Core Data को Mac OS X 10.4 Tiger (2005) में macOS के लिए पेश किया गया और iOS 3.0 (2009) में पोर्ट किया गया। 20 वर्षों से अधिक में, फ्रेमवर्क SQLite पर एक साधारण एब्सट्रैक्शन लेयर से NSPersistentCloudKitContainer के माध्यम से क्लाउड सिंक्रोनाइज़ेशन, स्वचालित संदर्भ प्रबंधन के माध्यम से मल्टीथ्रेडिंग और Swift Concurrency के माध्यम से एसिंक्रोनस लोडिंग के साथ एक पूर्ण-विशेषताओं वाले स्टैक में विकसित हुआ है।

Slack Community (2025) के iOS डेवलपर सर्वेक्षण के अनुसार, Core Data का उपयोग 68% व्यावसायिक iOS ऐप्लिकेशन में स्थानीय डेटा भंडारण के लिए किया जाता है। जटिलता और स्तरित आर्किटेक्चर के लिए आलोचना के बावजूद, फ्रेमवर्क Apple ऐप्लिकेशन के लिए मानक बना हुआ है, सिस्टम के साथ गहन एकीकरण, शून्य लागत (SDK में निर्मित) और iCloud सिंक्रोनाइज़ेशन समर्थन के लिए धन्यवाद।

Core Data डेटाबेस नहीं है

एक सामान्य ग़लतफ़हमी Core Data को डेटाबेस मानना है। फ्रेमवर्क सीधे SQL क्वेरी निष्पादित नहीं करता और DBMS नहीं है। Core Data एक ऑब्जेक्ट ग्राफ़ प्रबंधन लेयर है जो संरक्षण के लिए SQLite, Binary या In-Memory स्टोर का उपयोग कर सकता है। सादृश्य: Core Data Hibernate या Entity Framework की तरह है लेकिन Apple पारिस्थितिकी तंत्र के लिए, और SQLite Hibernate के नीचे MySQL की तरह है।

Core Data आर्किटेक्चर: स्टैक और घटक

Core Data स्टैक चार परस्पर जुड़े घटकों से बना है: NSManagedObjectModel (डेटा स्कीमा), NSPersistentStoreCoordinator (स्टोर समन्वयक), NSManagedObjectContext (कार्य संदर्भ) और NSPersistentContainer (एकीकृत कंटेनर जो iOS 10 से तीनों को जोड़ता है)। NSPersistentContainer स्टैक निर्माण और कॉन्फ़िगरेशन को स्वचालित करता है।

प्रत्येक घटक सख्ती से परिभाषित कार्य करता है। NSManagedObjectModel संस्था विवरण के साथ .xcdatamodeld फ़ाइल लोड करता है। NSPersistentStoreCoordinator मॉडल को भौतिक स्टोर फ़ाइल (SQLite) से जोड़ता है। NSManagedObjectContext ऑब्जेक्ट के साथ काम करने के लिए अस्थायी क्षेत्र प्रदान करता है। कंटेनर सब कुछ एक इनिशियलाइज़ेशन कॉल में जोड़ता है।

Core Data स्टोर प्रकार

SQLite (NSSQLiteStoreType) अधिकांश ऐप्लिकेशन में उपयोग किया जाने वाला मानक स्टोर है। डेटा ACID लेन-देन समर्थन के साथ एक .sqlite फ़ाइल में सहेजा जाता है। Binary (NSBinaryStoreType) छोटे डेटासेट (कुछ सौ ऑब्जेक्ट तक) के लिए बाइनरी प्रारूप स्टोर है। In-Memory (NSInMemoryStoreType) डिस्क संरक्षण के बिना RAM में अस्थायी स्टोर है, परीक्षण और कैशिंग के लिए उपयोग किया जाता है।

स्टोर प्रकारप्रारूपप्रदर्शनकब उपयोग करें
SQLite.sqliteउच्चउत्पादन के लिए मानक विकल्प
Binary.binaryमध्यमछोटे डेटासेट
In-MemoryRAMअधिकतमपरीक्षण, कैश, अस्थायी डेटा
CloudKitiCloudनेटवर्क पर निर्भरक्रॉस-डिवाइस सिंक्रोनाइज़ेशन

स्टोर प्रकार NSPersistentStoreDescription को इनिशियलाइज़ करते समय एक पंक्ति में सेट किया जाता है। डेवलपर यूनिट परीक्षणों के लिए SQLite से In-Memory या iCloud सिंक्रोनाइज़ेशन के लिए CloudKit पर स्विच कर सकता है बिना ऑब्जेक्ट हेरफेर कोड बदले — Core Data एकीकृत संदर्भ API के माध्यम से स्टोर प्रकारों के बीच अंतर को अमूर्त करता है।

NSManagedObject और NSManagedObjectContext

NSManagedObject सभी Core Data ऑब्जेक्ट के लिए आधार वर्ग है, जो एक एकल संस्था रिकॉर्ड का प्रतिनिधित्व करता है। प्रत्येक प्रबंधित ऑब्जेक्ट में एक अद्वितीय NSManagedObjectID (स्थायी पहचानकर्ता) होता है, एक संदर्भ से बंधा होता है, और KVO (की-वैल्यू ऑब्ज़र्विंग) के माध्यम से अपने परिवर्तनों को ट्रैक करता है। डेवलपर टाइप की गई संस्था गुणों को परिभाषित करने के लिए NSManagedObject उपवर्ग बनाते हैं।

NSManagedObjectContext Core Data का केंद्रीय घटक है जो सभी ऑब्जेक्ट संचालन के लिए कार्यक्षेत्र प्रदान करता है। संदर्भ जोड़, हटाने और परिवर्तनों को ट्रैक करता है (चेंज ट्रैकिंग), undoManager के माध्यम से ऑपरेशन पूर्ववत का समर्थन करता है, और सेव सूचनाएँ प्राप्त करने पर अन्य संदर्भों से परिवर्तनों को स्वचालित रूप से मर्ज करता है।

संदर्भ थ्रेड सुरक्षा

निजी कतार नियम: NSManagedObjectContext .privateQueueConcurrencyType या .mainQueueConcurrencyType के साथ बनाया जाता है। मुख्य संदर्भ मुख्य UI थ्रेड से बंधा होता है, जबकि निजी संदर्भ पृष्ठभूमि कतारों पर चलते हैं। प्रत्येक संदर्भ का उपयोग केवल अपनी कतार पर किया जाना चाहिए — किसी अन्य थ्रेड से प्रबंधित ऑब्जेक्ट तक पहुँच क्रैश का कारण बनती है। parentContext एसिंक्रोनस राइट के लिए संदर्भों का पदानुक्रम व्यवस्थित करने की अनुमति देता है।

swift
struct CoreDataStack {
    let container: NSPersistentContainer

    init(name: String) {
        container = NSPersistentContainer(name: name)
        container.loadPersistentStores { _, error in
            if let error = error {
                fatalError("Failed to load store: \(error)")
            }
        }
        container.viewContext.automaticallyMergesChangesFromParent = true
    }

    func backgroundContext() -> NSManagedObjectContext {
        let context = container.newBackgroundContext()
        context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
        return context
    }
}

NSPersistentContainer स्वचालित रूप से viewContext (मुख्य कतार) बनाता है और पृष्ठभूमि संचालन के लिए newBackgroundContext() प्रदान करता है। automaticallyMergesChangesFromParent = true सेट करने पर viewContext स्वचालित रूप से पृष्ठभूमि संदर्भों से परिवर्तन उठाता है जब वे सेव करते हैं, मैन्युअल डेटा रीफ़ेच के बिना UI अपडेट करता है।

परसिस्टेंट स्टोर और SQLite

NSPersistentStoreCoordinator भौतिक डेटा स्टोर प्रबंधित करता है: फ़ाइल खोलता है, मॉडल के आधार पर SQLite तालिकाएँ बनाता है, और स्कीमा बदलने पर माइग्रेशन करता है। NSSQLiteStoreType के साथ NSPersistentStoreDescription इनिशियलाइज़ करते समय, Core Data .xcdatamodeld मॉडल से मेल खाने वाली स्कीमा के साथ SQLite फ़ाइल बनाता है।

Core Data SELECT/INSERT/UPDATE के माध्यम से मानक SQL क्वेरी का उपयोग नहीं करता। इसके बजाय, यह मॉडल और NSFetchRequest के माध्यम से की गई क्वेरी के आधार पर आंतरिक SQL कमांड उत्पन्न करता है। डेवलपर क्वेरी प्रदर्शन डिबगिंग के लिए लॉन्च आर्गुमेंट -com.apple.CoreData.SQLDebug 1 के साथ SQL लॉगिंग सक्षम कर सकता है।

Core Data माइग्रेशन

लाइटवेट माइग्रेशन नए गुण जोड़ने, optional/required फ़्लैग बदलने या renamingID के साथ नाम बदलने पर SQLite स्कीमा अपडेट करने की स्वचालित प्रक्रिया है। संस्थाओं को मर्ज या विभाजित करने जैसे मूलभूत स्कीमा परिवर्तनों के लिए भारी माइग्रेशन आवश्यक है, और यह कस्टम NSMigrationManager के माध्यम से किया जाता है।

swift
let description = NSPersistentStoreDescription()
description.url = FileManager.default
    .urls(for: .documentDirectory, in: .userDomainMask)
    .first?
    .appendingPathComponent("Model.sqlite")
description.setOption(true as NSNumber,
    forKey: NSMigratePersistentStoresAutomaticallyOption)
description.setOption(true as NSNumber,
    forKey: NSInferMappingModelAutomaticallyOption)

let container = NSPersistentContainer(name: "AppModel")
container.persistentStoreDescriptions = [description]
container.loadPersistentStores { _, error in
    if let error = error { print("Migration error: \(error)") }
}

NSMigratePersistentStoresAutomaticallyOption और NSInferMappingModelAutomaticallyOption के माध्यम से स्वचालित माइग्रेशन सेट करने से Core Data मॉडल के नए संस्करण में गुण या संस्थाएँ जोड़ने पर स्वतंत्र रूप से SQLite फ़ाइल अपडेट कर सकता है। यदि माइग्रेशन संभव नहीं है, तो स्टोर समन्वयक कारण विवरण के साथ त्रुटि फेंकता है — डेवलपर को NSMigrationManager के माध्यम से कस्टम माइग्रेशन लागू करना होगा।

Core Data व्यवहार में: कोड और उदाहरण

NSFetchRequest Core Data से ऑब्जेक्ट लाने का प्राथमिक उपकरण है। एक अनुरोध में संस्था नाम, प्रेडिकेट (फ़िल्टर), सॉर्ट विवरणक, सीमा और ऑफ़सेट होता है। परिणाम NSManagedObject या टाइप किए गए उपवर्गों की सरणी के रूप में लौटाया जाता है। NSPredicate AND, OR, IN, LIKE और उपक्वेरी के साथ जटिल शर्तों का समर्थन करता है।

NSBatchDeleteRequest प्रत्येक ऑब्जेक्ट को मेमोरी में लोड किए बिना थोक में हटाने का कुशल तरीका है। अनुरोध SQLite स्तर पर निष्पादित होता है, प्रबंधित ऑब्जेक्ट संदर्भ को छोड़ता है, और पूरा होने के बाद ही संदर्भ अपडेट करता है। अपडेट (NSBatchUpdateRequest) और इन्सर्ट (NSBatchInsertRequest) के लिए समान बैच अनुरोध मौजूद हैं।

CRUD संचालन उदाहरण

CRUD (क्रिएट, रीड, अपडेट, डिलीट) Core Data में संदर्भ विधियों के माध्यम से किया जाता है: इन्सर्ट, फ़ेच, सेव और डिलीट। सभी परिवर्तन context.save() कॉल करने तक अस्थायी हैं — यह विधि परिवर्तनों को स्थायी SQLite स्टोर में सहेजती है। सेव त्रुटि पर, संदर्भ पुनः प्रयास के लिए अपनी परिवर्तित स्थिति में रहता है।

swift
let context = container.viewContext

// बनाएँ
let user = User(context: context)
user.id = 42
user.name = "Alice"

// पढ़ें
let request = User.fetchRequest()
request.predicate = NSPredicate(format: "name CONTAINS %@", "Ali")
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
let results = try context.fetch(request)

// अपडेट करें
results.first?.name = "Alice Updated"

// हटाएँ
if let first = results.first { context.delete(first) }

// सहेजें
try context.save()

संदर्भ को सहेजना (context.save()) एक महत्वपूर्ण संचालन है। यदि सेव नहीं कहा जाता है, तो सभी परिवर्तन केवल मेमोरी में रहते हैं। संदर्भ hasChanges स्थिति को ट्रैक करता है, जिसे सेव करने से पहले जाँचा जा सकता है। पृष्ठभूमि संचालन के लिए, अपने स्वयं के सेव के साथ newBackgroundContext का उपयोग करें, और UI के लिए, टाइमर पर या ऐप के पृष्ठभूमि में जाने पर स्वचालित सेव के साथ viewContext का उपयोग करें।

Core Data सर्वोत्तम अभ्यास

पहला अभ्यास — उपयोगकर्ता उपकरणों के बीच iCloud के माध्यम से डेटा सिंक्रोनाइज़ करने के लिए NSPersistentCloudKitContainer का उपयोग करें। क्लाउड सिंक्रोनाइज़ेशन परसिस्टेंट स्टोर विवरण में CloudKit विकल्प जोड़कर सक्षम किया जाता है। Core Data स्वचालित रूप से सिंक्रोनाइज़ेशन विरोध प्रबंधित करता है और अन्य उपकरणों से परिवर्तन मर्ज करता है।

दूसरा अभ्यास — बड़ी तालिकाओं पर प्रेडिकेट के बिना fetchRequest से बचें। प्रत्येक बिना शर्त फ़ेच सभी संस्था ऑब्जेक्ट को मेमोरी में लोड करता है, जिससे उच्च RAM खपत और UI धीमापन होता है। हमेशा प्रेडिकेट और सीमाएँ का उपयोग करें। पेजिनेशन के लिए, NSFetchRequest में fetchLimit और fetchOffset का उपयोग करें।

तीसरा अभ्यास — मल्टीथ्रेडेड एक्सेस में विरोध हल करने के लिए mergePolicy कॉन्फ़िगर करें। NSMergeByPropertyObjectTrumpMergePolicy अंतिम सहेजे गए संदर्भ से विरोधित गुण अपडेट करता है। NSRollbackMergePolicy विरोध पर वर्तमान संदर्भ परिवर्तनों को त्याग देता है। नीति का चयन ऐप्लिकेशन के व्यावसायिक तर्क पर निर्भर करता है।

चौथा अभ्यास — तालिका और संग्रह एकीकरण के लिए NSFetchedResultsController का उपयोग करें। यह स्वचालित रूप से NSManagedObjectContextDidSave सूचनाओं की सदस्यता लेता है, केवल आवश्यक ऑब्जेक्ट लोड करता है (faulting), और UITableView एनिमेशन के लिए उपयुक्त इंडेक्स पथ के साथ इन्सर्शन, डिलीशन और मूव के बारे में डेलिगेट को सूचित करता है।

प्रदर्शन: प्रीफ़ेचिंग और फ़ॉल्टिंग

फ़ॉल्टिंग Core Data का आलसी लोडिंग तंत्र है। फ़ेच अनुरोध द्वारा लौटाया गया प्रबंधित ऑब्जेक्ट फ़ॉल्ट स्थिति में है — इसके गुण पूरी तरह से लोड नहीं हैं, केवल पहचानकर्ता। पूर्ण लोडिंग (फ़ायर फ़ॉल्ट) किसी भी गुण तक पहली पहुँच पर होती है। रिलेशनशिप प्रीफ़ेचिंग (setRelationshipKeyPathsForPrefetching) संबंधित ऑब्जेक्ट को अग्रिम रूप से लोड करता है, N+1 क्वेरी से बचता है।

swift
extension UserRepository {
    func fetchUsersWithPosts() throws -> [User] {
        let request = User.fetchRequest()
        request.predicate = NSPredicate(format: "isActive == YES")
        request.relationshipKeyPathsForPrefetching = ["posts"]
        request.returnsObjectsAsFaults = false
        request.fetchBatchSize = 20

        let context = container.viewContext
        return try context.fetch(request)
    }
}

fetchBatchSize = 20 Core Data को एक बार में पूरी तालिका लोड किए बिना 20 ऑब्जेक्ट के बैच में डेटा लोड करने (स्क्रीन प्रदर्शन के लिए) के लिए बाध्य करता है। फ़्लैग returnsObjectsAsFaults = false सुनिश्चित करता है कि सभी उपयोगकर्ता गुण तुरंत लोड हों, जो सीधे प्रदर्शन के लिए उपयोगी है। “posts” संबंध का प्रीफ़ेचिंग पोस्ट तक पहुँचने पर प्रत्येक उपयोगकर्ता के लिए अलग-अलग क्वेरी से बचता है।

अक्सर पूछे जाने वाले प्रश्न

क्या Core Data एक डेटाबेस है?

नहीं, Core Data ऑब्जेक्ट ग्राफ़ प्रबंधन फ्रेमवर्क है। यह ऑब्जेक्ट के साथ काम करने, परिवर्तनों को ट्रैक करने और उन्हें संग्रहीत करने के लिए API प्रदान करता है। Core Data के अंतर्निहित डेटाबेस (डिफ़ॉल्ट रूप से SQLite) को फ्रेमवर्क के साथ भ्रमित नहीं करना चाहिए। Core Data एक ORM है, DBMS नहीं।

क्या Core Data को SQLite के बिना उपयोग किया जा सकता है?

हाँ, Core Data तीन प्रकार के स्टोर का समर्थन करता है: SQLite, Binary और In-Memory। स्टोर प्रकार NSPersistentStoreDescription के माध्यम से सेट किया जाता है। In-Memory स्टोर डेटा को डिस्क पर संग्रहीत नहीं करता और यूनिट परीक्षणों के लिए उपयुक्त है। Binary स्टोर कॉम्पैक्ट ऑब्जेक्ट सेट के लिए विरासत प्रारूप है।

Core Data को मॉडल के नए संस्करण में कैसे माइग्रेट करें?

लाइटवेट माइग्रेशन के लिए, NSMigratePersistentStoresAutomaticallyOption और NSInferMappingModelAutomaticallyOption सक्षम करें। जटिल परिवर्तनों के लिए, Xcode के माध्यम से Mapping Model (.xcmappingmodel) बनाएँ। CloudKit स्टोर (NSPersistentCloudKitContainer) iCloud सर्वर के साथ स्कीमा सिंक करते समय स्वचालित रूप से माइग्रेशन का समर्थन करता है।

Core Data SwiftData से कैसे अलग है?

SwiftData एक नया Apple फ्रेमवर्क (iOS 17+) है जो Swift Macros और Swift Concurrency का उपयोग करके Core Data के ऊपर बनाया गया है। SwiftData का सिंटैक्स सरल है: संस्थाओं को @Model मैक्रो के साथ वर्णित किया जाता है, संदर्भ @Environment(\.modelContext) के साथ। अंतर्निहित रूप से, SwiftData उसी Core Data स्टैक और SQLite का उपयोग करता है।

धीमी Core Data क्वेरी को कैसे डीबग करें?

लॉन्च आर्गुमेंट -com.apple.CoreData.SQLDebug 1 सक्षम करें — Core Data Xcode कंसोल में सभी SQL क्वेरी और उनकी अवधि आउटपुट करेगा। प्रोफाइलिंग के लिए, Core Data टेम्पलेट के साथ Instruments का उपयोग करें, जो फ़ॉल्ट अनुरोधों की संख्या, ऑब्जेक्ट लोड समय और संदर्भ सेव अवधि दिखाता है।

सारांश

  • Core Data iOS और macOS के लिए ऑब्जेक्ट ग्राफ़ प्रबंधन और संरक्षण फ्रेमवर्क है, जो डिफ़ॉल्ट स्टोर के रूप में SQLite का उपयोग करता है।
  • Core Data स्टैक में एकीकृत कॉन्फ़िगरेशन के लिए NSManagedObjectModel, NSPersistentStoreCoordinator, NSManagedObjectContext और NSPersistentContainer शामिल हैं।
  • NSManagedObjectContext परिवर्तन ट्रैकिंग, पूर्ववत समर्थन और पृष्ठभूमि संदर्भों से स्वचालित मर्जिंग वाला कार्यक्षेत्र है।
  • NSFetchRequest NSPredicate और रिलेशनशिप प्रीफ़ेचिंग के साथ प्राथमिक फ़ेच उपकरण है, जो बैच आकार और फ़ॉल्टिंग के माध्यम से अनुकूलित है।
  • लाइटवेट माइग्रेशन मॉडल के नए संस्करण में गुण और संस्थाएँ जोड़ने पर स्वचालित रूप से SQLite स्कीमा अपडेट करता है।
  • NSPersistentCloudKitContainer स्वचालित विरोध समाधान के साथ उपयोगकर्ता उपकरणों में iCloud सिंक्रोनाइज़ेशन जोड़ता है।
  • अनुशंसा — पदानुक्रमित ऑब्जेक्ट मॉडल वाले iOS ऐप्लिकेशन के लिए Core Data का उपयोग करें; सरल स्थानीय भंडारण के लिए, GRDB या SwiftData पर विचार करें।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें