Core Data হলো iOS এবং macOS অ্যাপ্লিকেশনে অবজেক্ট গ্রাফ পরিচালনার জন্য Apple-এর একটি ফ্রেমওয়ার্ক। এটি ডেটা সংরক্ষণ, পরিবর্তন ট্র্যাকিং, অপারেশন পূর্বাবস্থা এবং NSFetchedResultsController-এর মাধ্যমে UI ইন্টিগ্রেশন প্রদান করে। Apple Developer ডকুমেন্টেশন (2025) অনুযায়ী, Core Data একটি ডেটাবেস নয় — এটি একটি অবজেক্ট মডেলিং লেয়ার যা ডিফল্টরূপে SQLite-কে স্থায়ী স্টোর হিসেবে ব্যবহার করে অবজেক্ট লোড এবং সংরক্ষণের জন্য।
মূল বিষয়
Core Data হলো একটি অবজেক্ট গ্রাফ ব্যবস্থাপনা এবং স্থায়ীত্ব ফ্রেমওয়ার্ক যা Apple-এর Cocoa Touch SDK-এর অংশ। এটি ডেটার সাথে কাজ করার জন্য অবজেক্ট-ওরিয়েন্টেড ইন্টারফেস প্রদান করে: ডেভেলপার সত্তা, অ্যাট্রিবিউট এবং সম্পর্ক নিয়ে কাজ করে, আর Core Data এই অবজেক্টগুলোকে পর্দার আড়ালে রিলেশনাল ডেটাবেস রেকর্ডে রূপান্তর করে।
Core Data Mac OS X 10.4 Tiger (2005)-এ macOS-এর জন্য প্রবর্তিত হয়েছিল এবং iOS 3.0 (2009)-এ পোর্ট করা হয়েছিল। ২০ বছরেরও বেশি সময় ধরে, ফ্রেমওয়ার্কটি SQLite-এর ওপর একটি সাধারণ অ্যাবস্ট্রাকশন লেয়ার থেকে NSPersistentCloudKitContainer-এর মাধ্যমে ক্লাউড সিঙ্ক্রোনাইজেশন, স্বয়ংক্রিয় কনটেক্সট ব্যবস্থাপনার মাধ্যমে মাল্টিথ্রেডিং এবং Swift Concurrency-এর মাধ্যমে অ্যাসিঙ্ক্রোনাস লোডিং সমৃদ্ধ একটি পূর্ণ-বৈশিষ্ট্যযুক্ত স্ট্যাকে বিবর্তিত হয়েছে।
Slack Community (2025)-এর iOS ডেভেলপার জরিপ অনুযায়ী, Core Data ৬৮% বাণিজ্যিক iOS অ্যাপ্লিকেশনে স্থানীয় ডেটা স্টোরেজের জন্য ব্যবহৃত হয়। জটিলতা এবং স্তরিত আর্কিটেকচারের সমালোচনা সত্ত্বেও, সিস্টেমের সাথে গভীর একীকরণ, শূন্য খরচ (SDK-তে নির্মিত) এবং iCloud সিঙ্ক্রোনাইজেশন সমর্থনের কারণে ফ্রেমওয়ার্কটি Apple অ্যাপ্লিকেশনের জন্য মানদণ্ড remains।
একটি সাধারণ ভুল ধারণা হলো Core Data-কে ডেটাবেস মনে করা। ফ্রেমওয়ার্কটি সরাসরি SQL কোয়েরি কার্যকর করে না এবং এটি একটি DBMS নয়। Core Data হলো একটি অবজেক্ট গ্রাফ ব্যবস্থাপনা লেয়ার যা স্থায়ীত্বের জন্য SQLite, Binary বা In-Memory স্টোর ব্যবহার করতে পারে। উপমা: Core Data হলো Hibernate বা Entity Framework-এর মতো কিন্তু Apple ইকোসিস্টেমের জন্য, এবং এর নিচে SQLite হলো Hibernate-এর নিচে MySQL-এর মতো।
Core Data স্ট্যাক চারটি আন্তঃসংযুক্ত উপাদান নিয়ে গঠিত: NSManagedObjectModel (ডেটা স্কিমা), NSPersistentStoreCoordinator (স্টোর সমন্বয়কারী), NSManagedObjectContext (কর্ম কনটেক্সট) এবং NSPersistentContainer (একীভূত কন্টেইনার যা iOS 10 থেকে তিনটিকে একত্রিত করে)। NSPersistentContainer স্ট্যাক তৈরি এবং কনফিগারেশন স্বয়ংক্রিয় করে।
প্রতিটি উপাদান কঠোরভাবে সংজ্ঞায়িত কাজ করে। NSManagedObjectModel সত্তা বর্ণনাসহ .xcdatamodeld ফাইল লোড করে। NSPersistentStoreCoordinator মডেলটিকে ভৌত স্টোর ফাইলের (SQLite) সাথে সংযুক্ত করে। NSManagedObjectContext অবজেক্টের সাথে কাজ করার জন্য অস্থায়ী এলাকা প্রদান করে। কন্টেইনার সবকিছু একটি একক আরম্ভকরণ কলে একত্রিত করে।
SQLite (NSSQLiteStoreType) বেশিরভাগ অ্যাপ্লিকেশনে ব্যবহৃত মানক স্টোর। ডেটা ACID লেনদেন সমর্থনসহ একটি .sqlite ফাইলে সংরক্ষিত হয়। Binary (NSBinaryStoreType) ছোট ডেটাসেটের (কয়েকশো অবজেক্ট পর্যন্ত) জন্য বাইনারি ফরম্যাট স্টোর। In-Memory (NSInMemoryStoreType) ডিস্কে সংরক্ষণ ছাড়া RAM-তে অস্থায়ী স্টোর, পরীক্ষা এবং ক্যাশিংয়ের জন্য ব্যবহৃত।
| স্টোরের ধরন | ফরম্যাট | কর্মক্ষমতা | কখন ব্যবহার করবেন |
|---|---|---|---|
| SQLite | .sqlite | উচ্চ | প্রোডাকশনের জন্য মানক পছন্দ |
| Binary | .binary | মধ্যম | ছোট ডেটাসেট |
| In-Memory | RAM | সর্বোচ্চ | পরীক্ষা, ক্যাশ, অস্থায়ী ডেটা |
| CloudKit | iCloud | নেটওয়ার্ক নির্ভর | ক্রস-ডিভাইস সিঙ্ক্রোনাইজেশন |
NSPersistentStoreDescription আরম্ভ করার সময় এক লাইনে স্টোরের ধরন নির্ধারণ করা হয়। ডেভেলপার ইউনিট পরীক্ষার জন্য SQLite থেকে In-Memory অথবা iCloud সিঙ্ক্রোনাইজেশনের জন্য CloudKit-এ স্যুইচ করতে পারে অবজেক্ট ম্যানিপুলেশন কোড পরিবর্তন না করেই — Core Data একীভূত কনটেক্সট API-র মাধ্যমে স্টোরের ধরনের মধ্যে পার্থক্য অ্যাবস্ট্রাক্ট করে।
NSManagedObject是所有 Core Data অবজেক্টের বেস ক্লাস, যা একটি একক সত্তা রেকর্ড উপস্থাপন করে। প্রতিটি পরিচালিত অবজেক্টের একটি অনন্য NSManagedObjectID (স্থায়ী শনাক্তকারী) থাকে, একটি কনটেক্সটের সাথে আবদ্ধ থাকে এবং KVO (কী-ভ্যালু অবজার্ভিং) এর মাধ্যমে তার পরিবর্তন ট্র্যাক করে। ডেভেলপাররা টাইপযুক্ত সত্তা বৈশিষ্ট্য সংজ্ঞায়িত করতে NSManagedObject সাবক্লাস তৈরি করে।
NSManagedObjectContext হলো Core Data-র কেন্দ্রীয় উপাদান যা সমস্ত অবজেক্ট অপারেশনের জন্য কর্মক্ষেত্র প্রদান করে। কনটেক্সট সংযোজন, অপসারণ এবং পরিবর্তন ট্র্যাক করে (চেঞ্জ ট্র্যাকিং), undoManager-এর মাধ্যমে অপারেশন পূর্বাবস্থা সমর্থন করে এবং সেভ নোটিফিকেশন গ্রহণের সময় অন্যান্য কনটেক্সট থেকে স্বয়ংক্রিয়ভাবে পরিবর্তন মার্জ করে।
প্রাইভেট কিউ নিয়ম: NSManagedObjectContext .privateQueueConcurrencyType বা .mainQueueConcurrencyType দিয়ে তৈরি করা হয়। মূল কনটেক্সট প্রধান UI থ্রেডের সাথে আবদ্ধ, যখন প্রাইভেট কনটেক্সট ব্যাকগ্রাউন্ড কিউতে চলে। প্রতিটি কনটেক্সট শুধুমাত্র নিজস্ব কিউতে ব্যবহার করা উচিত — অন্য থ্রেড থেকে পরিচালিত অবজেক্ট অ্যাক্সেস করলে ক্র্যাশ হয়। parentContext অ্যাসিঙ্ক্রোনাস রাইটের জন্য কনটেক্সটের শ্রেণিবিন্যাস সংগঠিত করার অনুমতি দেয়।
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 আপডেট করে।
NSPersistentStoreCoordinator ভৌত ডেটা স্টোর পরিচালনা করে: ফাইল খোলে, মডেলের ভিত্তিতে SQLite টেবিল তৈরি করে এবং স্কিমা পরিবর্তনে মাইগ্রেশন সম্পাদন করে। NSSQLiteStoreType দিয়ে NSPersistentStoreDescription আরম্ভ করার সময়, Core Data .xcdatamodeld মডেলের সাথে মেলে এমন স্কিমাসহ একটি SQLite ফাইল তৈরি করে।
Core Data SELECT/INSERT/UPDATE-এর মাধ্যমে মানক SQL কোয়েরি ব্যবহার করে না। পরিবর্তে, এটি মডেল এবং NSFetchRequest-এর মাধ্যমে করা কোয়েরির ভিত্তিতে অভ্যন্তরীণ SQL কমান্ড তৈরি করে। ডেভেলপার লঞ্চ আর্গুমেন্ট -com.apple.CoreData.SQLDebug 1 দিয়ে SQL লগিং সক্ষম করতে পারে কোয়েরি পারফরম্যান্স ডিবাগিংয়ের জন্য।
লাইটওয়েট মাইগ্রেশন হলো নতুন অ্যাট্রিবিউট যোগ করা, optional/required ফ্ল্যাগ পরিবর্তন বা renamingID দিয়ে নামকরণের সময় SQLite স্কিমা আপডেট করার স্বয়ংক্রিয় প্রক্রিয়া। সত্তা মার্জ বা বিভক্ত করার মতো মৌলিক স্কিমা পরিবর্তনের জন্য ভারী মাইগ্রেশন প্রয়োজন এবং এটি কাস্টম NSMigrationManager-এর মাধ্যমে করা হয়।
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-এর মাধ্যমে কাস্টম মাইগ্রেশন বাস্তবায়ন করতে হবে।
NSFetchRequest Core Data থেকে অবজেক্ট আনার প্রাথমিক টুল। একটি রিকোয়েস্টে সত্তার নাম, প্রেডিকেট (ফিল্টার), সর্ট বর্ণনাকারী, সীমা এবং অফসেট থাকে। ফলাফল NSManagedObject বা টাইপযুক্ত সাবক্লাসের অ্যারে হিসেবে ফেরত আসে। NSPredicate AND, OR, IN, LIKE এবং সাবকোয়েরি সহ জটিল শর্ত সমর্থন করে।
NSBatchDeleteRequest হলো প্রতিটি অবজেক্ট মেমরিতে লোড না করেই একসাথে অনেক অবজেক্ট মুছে ফেলার কার্যকর উপায়। রিকোয়েস্ট SQLite স্তরে কার্যকর হয়, পরিচালিত অবজেক্ট কনটেক্সট এড়িয়ে যায় এবং সম্পূর্ণ হওয়ার পরেই কনটেক্সট আপডেট করে। আপডেট (NSBatchUpdateRequest) এবং সন্নিবেশ (NSBatchInsertRequest)-এর জন্য অনুরূপ ব্যাচ রিকোয়েস্ট বিদ্যমান।
CRUD (ক্রিয়েট, রিড, আপডেট, ডিলিট) Core Data-তে কনটেক্সট মেথডের মাধ্যমে সম্পাদিত হয়: ইনসার্ট, ফেচ, সেভ এবং ডিলিট। context.save() কল না করা পর্যন্ত সব পরিবর্তন অস্থায়ী — এই মেথড পরিবর্তনগুলো স্থায়ী SQLite স্টোরে সংরক্ষণ করে। সেভ ত্রুটিতে, কনটেক্সট পুনরায় চেষ্টার জন্য তার পরিবর্তিত অবস্থায় থাকে।
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 ব্যবহার করুন।
প্রথম অনুশীলন — ব্যবহারকারীর ডিভাইসের মধ্যে iCloud-এর মাধ্যমে ডেটা সিঙ্ক্রোনাইজ করতে NSPersistentCloudKitContainer ব্যবহার করুন। ক্লাউড সিঙ্ক্রোনাইজেশন পারসিস্টেন্ট স্টোর বর্ণনায় CloudKit অপশন যোগ করে সক্রিয় করা হয়। Core Data স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজেশন দ্বন্দ্ব পরিচালনা করে এবং অন্যান্য ডিভাইস থেকে পরিবর্তন মার্জ করে।
দ্বিতীয় অনুশীলন — বড় টেবিলে প্রেডিকেট ছাড়া fetchRequest এড়িয়ে চলুন। প্রতিটি শর্তহীন ফেচ সব সত্তা অবজেক্ট মেমরিতে লোড করে, যা উচ্চ RAM খরচ এবং UI ধীরগতির কারণ হয়। সর্বদা প্রেডিকেট এবং সীমা ব্যবহার করুন। পেজিনেশনের জন্য, NSFetchRequest-এ fetchLimit এবং fetchOffset ব্যবহার করুন।
তৃতীয় অনুশীলন — মাল্টিথ্রেডেড অ্যাক্সেসে দ্বন্দ্ব সমাধানের জন্য mergePolicy কনফিগার করুন। NSMergeByPropertyObjectTrumpMergePolicy শেষ সেভ করা কনটেক্সট থেকে বিরোধপূর্ণ বৈশিষ্ট্য আপডেট করে। NSRollbackMergePolicy দ্বন্দ্বে বর্তমান কনটেক্সট পরিবর্তন বাতিল করে। নীতি নির্বাচন অ্যাপ্লিকেশনের ব্যবসায়িক যুক্তির উপর নির্ভর করে।
চতুর্থ অনুশীলন — টেবিল এবং কালেকশন ইন্টিগ্রেশনের জন্য NSFetchedResultsController ব্যবহার করুন। এটি স্বয়ংক্রিয়ভাবে NSManagedObjectContextDidSave নোটিফিকেশনে সাবস্ক্রাইব করে, শুধুমাত্র প্রয়োজনীয় অবজেক্ট লোড করে (ফল্টিং), এবং UITableView অ্যানিমেশনের জন্য উপযুক্ত ইনডেক্স পাথসহ ডেলিগেটকে সন্নিবেশ, অপসারণ এবং স্থানান্তর সম্পর্কে জানায়।
ফল্টিং হলো Core Data-র অলস লোডিং মেকানিজম। ফেচ রিকোয়েস্টের মাধ্যমে ফেরত আসা পরিচালিত অবজেক্ট ফল্ট অবস্থায় থাকে — এর বৈশিষ্ট্যগুলো সম্পূর্ণরূপে লোড হয়নি, শুধু শনাক্তকারী। সম্পূর্ণ লোডিং (ফায়ার ফল্ট) যেকোনো বৈশিষ্ট্যে প্রথম অ্যাক্সেসে ঘটে। রিলেশনশিপ প্রিফেচিং (setRelationshipKeyPathsForPrefetching) সম্পর্কিত অবজেক্ট আগেভাগে লোড করে, N+1 কোয়েরি এড়িয়ে।
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-কে একবারে পুরো টেবিল না লোড করে ২০টি অবজেক্টের ব্যাচে ডেটা লোড করতে (স্ক্রিন প্রদর্শনের জন্য) বাধ্য করে। ফ্ল্যাগ returnsObjectsAsFaults = false নিশ্চিত করে যে সব ব্যবহারকারী বৈশিষ্ট্য তাৎক্ষণিকভাবে লোড হয়েছে, যা সরাসরি প্রদর্শনের জন্য উপযোগী। “posts” সম্পর্কের প্রিফেচিং পোস্ট অ্যাক্সেস করার সময় প্রতিটি ব্যবহারকারীর জন্য পৃথক কোয়েরি এড়িয়ে চলে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
না, Core Data একটি অবজেক্ট গ্রাফ ব্যবস্থাপনা ফ্রেমওয়ার্ক। এটি অবজেক্টের সাথে কাজ করার, পরিবর্তন ট্র্যাক করার এবং সেগুলো সংরক্ষণের জন্য API প্রদান করে। Core Data-র আড়ালের ডেটাবেস (ডিফল্টরূপে SQLite) ফ্রেমওয়ার্কের সাথে গুলিয়ে ফেলা উচিত নয়। Core Data একটি ORM, DBMS নয়।
হ্যাঁ, Core Data তিন ধরনের স্টোর সমর্থন করে: SQLite, Binary এবং In-Memory। স্টোরের ধরন NSPersistentStoreDescription-এর মাধ্যমে নির্ধারণ করা হয়। In-Memory স্টোর ডিস্কে ডেটা সংরক্ষণ করে না এবং ইউনিট পরীক্ষার জন্য উপযুক্ত। Binary স্টোর কমপ্যাক্ট অবজেক্ট সেটের জন্য একটি লিগ্যাসি ফরম্যাট।
লাইটওয়েট মাইগ্রেশন-এর জন্য, NSMigratePersistentStoresAutomaticallyOption এবং NSInferMappingModelAutomaticallyOption সক্রিয় করুন। জটিল পরিবর্তনের জন্য, Xcode-এর মাধ্যমে Mapping Model (.xcmappingmodel) তৈরি করুন। CloudKit স্টোর (NSPersistentCloudKitContainer) iCloud সার্ভারের সাথে স্কিমা সিঙ্ক করার সময় স্বয়ংক্রিয়ভাবে মাইগ্রেশন সমর্থন করে।
SwiftData হলো একটি নতুন Apple ফ্রেমওয়ার্ক (iOS 17+) যা Swift Macros এবং Swift Concurrency ব্যবহার করে Core Data-র উপরে নির্মিত। SwiftData-র সিনট্যাক্স সহজ: সত্তা @Model ম্যাক্রো দিয়ে বর্ণনা করা হয়, কনটেক্সট @Environment(\.modelContext) দিয়ে। পর্দার আড়ালে, SwiftData একই Core Data স্ট্যাক এবং SQLite ব্যবহার করে।
লঞ্চ আর্গুমেন্ট -com.apple.CoreData.SQLDebug 1 সক্রিয় করুন — Core Data Xcode কনসোলে সব SQL কোয়েরি এবং তাদের সময়কাল আউটপুট করবে। প্রোফাইলিংয়ের জন্য, Core Data টেমপ্লেটসহ Instruments ব্যবহার করুন, যা ফল্ট রিকোয়েস্টের সংখ্যা, অবজেক্ট লোড সময় এবং কনটেক্সট সেভ সময়কাল দেখায়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন