Core Data হল Apple-এর একটি ডেটা ব্যবস্থাপনা ফ্রেমওয়ার্ক যা iOS, macOS, tvOS এবং watchOS-এর জন্য অবজেক্ট-রিলেশনাল ম্যাপিং প্রদান করে। এটি অ্যাপ্লিকেশনে অবজেক্ট সংরক্ষণ, পুনরুদ্ধার এবং ফিল্টারিং স্বয়ংক্রিয় করে, যা SQLite, XML বা বাইনারি স্টোরেজের উপরে কাজ করে। Apple Core Data Documentation অনুসারে, ফ্রেমওয়ার্কটি পার্সিস্টেন্স স্ট্যাক পরিচালনার জন্য Managed Object Context এবং NSPersistentContainer ধারণা ব্যবহার করে।
মূল পয়েন্ট
Core Data হল একটি অবজেক্ট গ্রাফ এবং পার্সিস্টেন্স ব্যবস্থাপনা ফ্রেমওয়ার্ক যা Cocoa Touch-এর অংশ। সাধারণ ভুল ধারণার বিপরীতে, Core Data একটি ডেটাবেস নয়, বরং একটি অবজেক্ট ব্যবস্থাপনা স্তর যা SQLite-কে তার একটি স্টোর হিসাবে ব্যবহার করতে পারে। Core Data-র প্রধান কাজ হল অবজেক্ট পরিবর্তনগুলি ট্র্যাক করা, তাদের জীবনচক্র পরিচালনা করা এবং ডিস্কের সাথে অবস্থা সিঙ্ক্রোনাইজ করা।
ফ্রেমওয়ার্কটি একটি অবজেক্ট গ্রাফ প্রদান করে যেখানে প্রতিটি Managed Object পরিবর্তনের জন্য কনটেক্সট দ্বারা ট্র্যাক করা হয়। সংরক্ষণ করার সময়, সমস্ত পরিবর্তিত, যোগ করা এবং মুছে ফেলা অবজেক্ট একটি একক লেনদেনে স্থায়ী স্টোরে কমিট হয়। এটি ডেভেলপারকে SQL কোয়েরি লেখা এবং ম্যানুয়ালি লেনদেন পরিচালনা করার প্রয়োজনীয়তা দূর করে।
Swift Developer Survey (2025) পরিসংখ্যান অনুসারে, Core Data স্থানীয় ডেটা নিয়ে কাজ করা 52% iOS অ্যাপ্লিকেশনে ব্যবহৃত হয়। আধুনিক বিকল্পের (SwiftData, Realm) আবির্ভাব সত্ত্বেও, Core Data তার পরিপক্কতা এবং গভীর সিস্টেম ইন্টিগ্রেশনের কারণে বিদ্যমান Apple প্রকল্পগুলিতে প্রাথমিক ফ্রেমওয়ার্ক হিসাবে রয়ে গেছে।
মধ্যম জটিলতার ডেটা মডেল সহ প্রকল্পগুলির জন্য Core Data ব্যবহার করুন, যেখানে অবজেক্ট সম্পর্ক, পরিবর্তন পূর্বাবস্থায় ফেরানো এবং ফল্টিং মেকানিজমের মাধ্যমে স্বয়ংক্রিয় ক্যাশিং প্রয়োজন।
Core Data আর্কিটেকচার Managed Object Context ধারণার চারপাশে নির্মিত — একটি কর্মক্ষেত্র যা সমস্ত অবজেক্ট পরিবর্তন ট্র্যাক করে। কনটেক্সট বিল্ট-ইন NSUndoManager-এর মাধ্যমে পূর্বাবস্থায় ফেরানো/পুনরায় করার সমর্থন করে, যা ম্যানুয়ালি অবস্থা স্ন্যাপশট সংরক্ষণ না করে খসড়া এবং কর্ম বাতিলকরণ বাস্তবায়নের অনুমতি দেয়। save() কল করার সময়, কনটেক্সট একটি একক লেনদেনে সমস্ত পরিবর্তন স্থায়ী স্টোরে কমিট করে, ডেটার পারমাণবিকতা এবং সামঞ্জস্য নিশ্চিত করে।
Core Data ডেটা মডেল .xcdatamodeld ফাইলে সংজ্ঞায়িত করা হয় — Xcode-এর ভিজুয়াল এডিটর যেখানে সমস্ত Entity, তাদের বৈশিষ্ট্য এবং সম্পর্ক বর্ণনা করা হয়। কম্পাইল করার সময়, মডেলটি .momd-এ সিরিয়ালাইজ হয় এবং NSManagedObjectModel-এর মাধ্যমে লোড হয়।
Entity হল একটি ডেটা টাইপের বিবরণ, যা SQL-এ টেবিলের মতো। প্রতিটি Entity-তে Attributes-এর একটি সেট থাকে — ডেটা টাইপ (String, Integer, Date, Boolean, Data) সহ নামযুক্ত ফিল্ড। Room-এর বিপরীতে, Core Data-র মডেল এডিটরের মাধ্যমে প্রতিটি বৈশিষ্ট্যের জন্য স্পষ্ট টাইপ নির্বাচন প্রয়োজন।
Relationship হল Entity-র মধ্যে একটি সংযোগ, যা SQL-এ বিদেশী কী-এর মতো। Core Data সব ধরনের সম্পর্ক সমর্থন করে: এক-থেকে-এক, এক-থেকে-অনেক এবং অনেক-থেকে-অনেক। প্রতিটি সম্পর্কের জন্য Delete Rule (Cascade, Nullify, Deny) কনফিগার করা হয় — সম্পর্কিত অবজেক্ট মুছে ফেলার সময় আচরণ।
| Delete Rule | মুছে ফেলার সময় আচরণ | ব্যবহারের উদাহরণ |
|---|---|---|
| Cascade | সমস্ত সম্পর্কিত অবজেক্ট মুছে ফেলে | আইটেম সহ অর্ডার মুছে ফেলা |
| Nullify | বিপরীত সম্পর্ককে শূন্য করে | বই না মুছে লেখক মুছে ফেলা |
| Deny | সম্পর্কিত অবজেক্ট থাকলে মুছে ফেলা ব্লক করে | পণ্য সহ বিভাগ মুছে ফেলা থেকে সুরক্ষা |
Delete Rule নির্বাচন করা ডেটা অখণ্ডতার জন্য গুরুত্বপূর্ণ: Cascade যাচাই ছাড়া ডেটাবেসের এক তৃতীয়াংশ মুছে ফেলতে পারে, যখন Deny অস্পষ্ট ত্রুটির সাথে অপারেশন ব্লক করতে পারে। প্রোডাকশন কোডে, ম্যানুয়াল অনাথ রেকর্ড হ্যান্ডলিং সহ Nullify সুপারিশ করা হয়।
Xcode মডেল এডিটরে, ডেভেলপার শুধু Entity এবং বৈশিষ্ট্যই নয়, বরং constraints (অনন্য সীমাবদ্ধতা), কোয়েরি ত্বরানের জন্য ইনডেক্স এবং বৈশিষ্ট্যগুলির জন্য ডিফল্ট মানও সংজ্ঞায়িত করতে পারে। সমস্ত মডেল পরিবর্তন .momd ফাইলে কম্পাইল হয়, যা NSPersistentContainer আরম্ভ করার সময় লোড হয়। মডেল ভার্সনিং (Model Versioning) একাধিক স্কিমা সংস্করণ বজায় রাখা এবং তাদের মধ্যে মাইগ্রেশন করার অনুমতি দেয়।
NSPersistentContainer হল একটি একক অবজেক্ট যা iOS 10 এবং macOS 10.12 থেকে Core Data স্ট্যাক পরিচালনা করে। এটি NSManagedObjectModel, NSPersistentStoreCoordinator এবং NSManagedObjectContext-কে এনক্যাপসুলেট করে, মডেল লোডিং এবং স্টোর কনফিগারেশন স্বয়ংক্রিয় করে। পুরানো সংস্করণগুলির জন্য, স্ট্যাকটি ম্যানুয়ালি তৈরি করা হত, কিন্তু এখন এটি সুপারিশ করা হয় না।
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores { _, error in
if let error { fatalError("Core Data load failed: \(error)") }
}
let context = container.viewContext
viewContext হল প্রধান থ্রেডের সাথে আবদ্ধ প্রধান কনটেক্সট। সমস্ত পড়া এবং UI আপডেট এর মাধ্যমে করা হয়। কর্মক্ষমতার জন্য, ডেটা লেখা পরবর্তী সিঙ্ক্রোনাইজেশন সহ ব্যাকগ্রাউন্ড চাইল্ড কনটেক্সটে করার সুপারিশ করা হয়।
NSPersistentStoreCoordinator কোঅর্ডিনেটর মডেলটিকে ডিস্কে ভৌত স্টোরেজের সাথে সংযুক্ত করে। Core Data বিভিন্ন ধরনের স্টোর সমর্থন করে: SQLite (সুপারিশকৃত), Binary এবং In-Memory। SQLite স্টোর মাইগ্রেশন, বর্ধিত ব্যাকআপ এবং লেখার অপারেশন চলাকালীন ক্র্যাশ প্রতিরোধ ক্ষমতা সমর্থন করে।
NSFetchRequest হল একটি অবজেক্ট যা Core Data স্টোরে একটি কোয়েরি বর্ণনা করে। এতে Entity-র নাম, ফিল্টার প্রেডিকেট, সর্ট ডিস্ক্রিপ্টর এবং ফেচ সেটিংস রয়েছে। কোয়েরিটি context.fetch()-এর মাধ্যমে নির্বাহিত হয়, যা NSManagedObject-এর একটি অ্যারে ফেরত দেয়।
let request = NSFetchRequest<User>(entityName: "User")
request.predicate = NSPredicate(format: "age >= %d", 18)
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
request.fetchLimit = 50
let results = try context.fetch(request)
NSPredicate জটিল শর্ত সমর্থন করে: LIKE, IN, BETWEEN, CONTAINS[c] (কেস-অসংবেদনশীল), সম্পর্কিত Entity-তে নেস্টেড কোয়েরির জন্য SUBQUERY। Core Data NSFetchedResultsController-ও সমর্থন করে — UITableView-তে প্রতিক্রিয়াশীল ডেটা লোডিংয়ের জন্য একটি ক্লাস, যা স্বয়ংক্রিয়ভাবে পরিবর্তনগুলি ট্র্যাক করে এবং অ্যানিমেটেড সেকশন সহ টেবিল আপডেট করে।
মাল্টিথ্রেডেড অ্যাপ্লিকেশনে Core Data-র সাথে কাজ করার জন্য কঠোর নিয়ম মেনে চলা প্রয়োজন: NSManagedObject সরাসরি থ্রেডের মধ্যে পাস করা যায় না। প্রতিটি থ্রেড (বা কিউ) তার নিজস্ব কনটেক্সট ব্যবহার করতে হবে। প্রধান পদ্ধতি হল লেখার জন্য প্রাইভেট কিউ (NSPrivateQueueConcurrencyType) সহ চাইল্ড NSManagedObjectContext এবং পড়ার জন্য viewContext তৈরি করা।
চাইল্ড কনটেক্সট প্যারেন্টে সংরক্ষণ করে, এবং তারপর প্যারেন্ট ডিস্ক স্টোরে সংরক্ষণ করে। এটি গ্যারান্টি দেয় যে পরিবর্তনগুলি প্রধান থ্রেড ব্লক করে না এবং UI সর্বদা mergeChanges বা সংরক্ষণ করার সময় স্বয়ংক্রিয় viewContext আপডেটের মাধ্যমে একটি সামঞ্জস্যপূর্ণ অবস্থা দেখে।
Core Data faulting ব্যবহার করে — সম্পর্কিত অবজেক্টের জন্য একটি বিলম্বিত লোডিং পদ্ধতি। User-কে তার ঠিকানার অনুরোধ না করে ফেচ করার সময়, সম্পর্কিত Address অবজেক্টগুলি ডট নোটেশন দ্বারা অ্যাক্সেস না করা পর্যন্ত লোড হয় না। Faulting মেমরি বাঁচায় এবং লোডিং দ্রুত করে, কিন্তু ব্যাকগ্রাউন্ড কনটেক্সটে অ্যাক্সেস নিয়ন্ত্রণ না করলে প্রধান থ্রেডে অপ্রত্যাশিত ডিস্ক অ্যাক্সেসের কারণ হতে পারে।
দক্ষ মাল্টিথ্রেডিংয়ের জন্য, মেমরিতে অবজেক্ট লোড না করে বাল্ক সন্নিবেশ এবং মুছে ফেলার জন্য NSBatchInsertRequest এবং NSBatchDeleteRequest ব্যবহার করুন — এটি সার্ভারের সাথে ডেটা সিঙ্ক্রোনাইজেশনের জন্য গুরুত্বপূর্ণ।
ব্যাচ অপারেশনগুলি কনটেক্সট এবং অবজেক্ট গ্রাফকে বাইপাস করে সরাসরি NSPersistentStoreCoordinator স্তরে নির্বাহিত হয়। এটি মেমরিতে 10,000 NSManagedObject ইনস্ট্যান্স তৈরি না করে মিলিসেকেন্ডে 10,000 রেকর্ড সন্নিবেশ করার অনুমতি দেয়। ব্যাচ অনুরোধ নির্বাহ করার পরে, UI-তে নতুন ডেটা প্রতিফলিত করতে mergeChangesFromContextDidSaveNotification-এর মাধ্যমে কনটেক্সট আপডেট করতে হবে। Apple প্রাথমিক ডেটা লোডিং এবং রাতারাতি সার্ভার সিঙ্ক্রোনাইজেশনের জন্য ব্যাচ অপারেশন সুপারিশ করে।
Core Data-তে পরিবর্তন ট্র্যাকিংয়ের জন্য NSPersistentHistoryTracking ব্যবহার করা হয় — একটি পদ্ধতি যা প্রতিটি লেনদেন (সন্নিবেশ, আপডেট, মুছে ফেলা) একটি পৃথক ইতিহাসে রেকর্ড করে। ইতিহাস ট্র্যাকিং সক্ষম করলে একই SQLite ফাইলের সাথে কাজ করা বিভিন্ন প্রক্রিয়া এবং অ্যাপ্লিকেশনের মধ্যে ডেটা সিঙ্ক্রোনাইজেশনের অনুমতি দেয়, যেমন প্রধান অ্যাপ্লিকেশন এবং Notification Service Extension-এর মধ্যে। সক্রিয়করণ persistentHistoryTrackingKey ফ্ল্যাগ সহ NSPersistentStoreDescription-এর মাধ্যমে করা হয়, এবং পড়া NSPersistentHistoryChangeRequest-এর মাধ্যমে তারিখ এবং লেনদেনের ধরন অনুসারে ফিল্টার করে করা হয়।
Core Data ডিবাগিং এবং পারফরম্যান্স প্রোফাইলিংয়ের জন্য macOS-এ Xcode-এ Instruments স্যুট থেকে Core Data Profiler টুল ব্যবহার করা হয়। এটি প্রতিটি অপারেশনের সময়কাল এবং টেবিল এবং টাইমলাইন গ্রাফে লোড করা অবজেক্টের সংখ্যা সহ সমস্ত ফেচ, সন্নিবেশ, মুছে ফেলা এবং সংরক্ষণ অপারেশন দেখায়। ডেভেলপার সমস্যা এলাকা চিহ্নিত করতে পারে: একই কোয়েরির একাধিক ফেচ (ক্যাশিংয়ের অভাব), টেবিল স্ক্রল করার সময় ফল্ট অবজেক্ট লিক বা সম্পর্কিত সত্ত্বার সিঙ্ক্রোনাস লোডিংয়ের কারণে প্রধান থ্রেড ব্লকিং। সিমুলেটরে নয় বরং বাস্তব ডিভাইসে প্রোফাইলিং চালানোর সুপারিশ করা হয়, কারণ সিমুলেটরের পারফরম্যান্স iPhone বা iPad-এ অ্যাপ্লিকেশনের বাস্তব আচরণ প্রতিফলিত করে না।
সচরাচর জিজ্ঞাস্য
Core Data একটি ডেটাবেস নয়, বরং একটি অবজেক্ট ব্যবস্থাপনা স্তর যা SQLite-কে স্টোর হিসাবে ব্যবহার করতে পারে। সরাসরি SQLite-এর বিপরীতে, Core Data অবজেক্ট পরিবর্তন ট্র্যাক করে, পূর্বাবস্থায় ফেরানো পরিচালনা করে এবং faulting এবং ক্যাশিং সহ অবজেক্ট গ্রাফ প্রদান করে। SQLite কোয়েরির উপর বেশি নিয়ন্ত্রণ দেয়, কিন্তু SQL লেখা এবং ম্যানুয়ালি লেনদেন পরিচালনা প্রয়োজন।
Core Data অ-ধ্বংসাত্মক পরিবর্তনের জন্য লাইটওয়েট মাইগ্রেশন (Lightweight Migration) সমর্থন করে: বৈশিষ্ট্য যোগ করা, নাম পরিবর্তন করা, ডিফল্ট মান সেট করা। জটিল পরিবর্তনের জন্য, Mapping Model তৈরি করা হয়। Lightweight মাইগ্রেশন NSPersistentStoreDescription-এ shouldMigrateAutomatically ফ্ল্যাগের মাধ্যমে সক্ষম করা হয়।
হ্যাঁ, Core Data SwiftUI-এর সাথে @FetchRequest র্যাপারের মাধ্যমে কোয়েরির জন্য এবং @ObservedObject-এর মাধ্যমে পরিবর্তন সাবস্ক্রিপশনের জন্য একীভূত হয়। ManagedObject পরিবর্তন হলে SwiftUI স্বয়ংক্রিয়ভাবে View আপডেট করে, যা Core Data এবং SwiftUI-কে অবস্থা ব্যবস্থাপনার জন্য একটি সামঞ্জস্যপূর্ণ স্ট্যাক করে তোলে।
Fault হল Core Data গ্রাফে একটি হালকা প্লেসহোল্ডার যাতে সম্পর্কিত অবজেক্টের ডেটা থাকে না। fault সেট করার সময় (refreshObject:-এর মাধ্যমে), ডেটা মেমরি থেকে আনলোড হয়। একটি প্রপার্টি অ্যাক্সেস করার সময়, fault স্বয়ংক্রিয়ভাবে স্টোর থেকে ডেটা দিয়ে পূর্ণ হয় — এটি একটি বিলম্বিত লোডিং পদ্ধতি যা মেমরি ব্যবহার অপ্টিমাইজ করে।
পরীক্ষার জন্য, In-Memory স্টোর টাইপ ব্যবহার করুন: NSPersistentStoreDescription NSInMemoryStoreType সহ। কন্টেইনার পরীক্ষা বান্ডেল থেকে মডেল দিয়ে তৈরি করা হয়। প্রতিটি পরীক্ষার পরে, সমস্ত অবজেক্ট মুছে ফেলুন বা কন্টেইনার পুনরায় তৈরি করুন — এটি পরীক্ষার কেসগুলিকে একে অপরের থেকে বিচ্ছিন্ন করার গ্যারান্টি দেয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন