Core Data — iOS va macOS ilovalarida obyekt grafigini boshqarish uchun Apple freymvorki. U ma'lumotlarni saqlash, o'zgarishlarni kuzatish, operatsiyalarni bekor qilish va UI bilan integratsiyani NSFetchedResultsController orqali ta'minlaydi. Apple Developer (2025) hujjatlariga ko'ra, Core Data ma'lumotlar bazasi emas — bu obyektlarni yuklash va saqlash uchun standart sifatida SQLite dan foydalanadigan obyekt modellashtirish qatlamidir.
Asosiy ma'lumotlar
Core Data — Apple-ning Cocoa Touch SDK tarkibiga kiruvchi obyekt grafigini boshqarish va ma'lumotlarning saqlanishi freymvorkidir. U ma'lumotlar bilan ishlash uchun obyektga yo'naltirilgan interfeysni ta'minlaydi: ishlab chiquvchi ob'ektlar (Entity), atributlar va munosabatlar (Relationship) bilan ishlaydi, Core Data esa bu obyektlarni ichki tizimda relyatsion ma'lumotlar bazasi yozuvlariga aylantiradi.
Core Data Mac OS X 10.4 Tiger (2005) da macOS uchun taqdim etilgan va iOS 3.0 (2009) ga ko'chirilgan. 20 yildan ortiq vaqt davomida freymvork SQLite ustidagi oddiy abstraksiya qatlamidan NSPersistentCloudKitContainer orqali bulut sinxronizatsiyasi, kontekstlarni avtomatik boshqarish orqali ko'p tarmoqlilik va Swift Concurrency orqali asinxron yuklashni qo'llab-quvvatlovchi to'liq stekga aylandi.
Slack Community (2025) iOS ishlab chiquvchilari so'roviga ko'ra, Core Data mahalliy ma'lumotlarni saqlash uchun tijorat iOS ilovalarining 68 foizida qo'llaniladi. Murakkablik va ko'p qatlamlilik uchun tanqid qilinishiga qaramay, freymvork tizim bilan chambarchas integratsiya, nol xarajat (SDK ga o'rnatilgan) va iCloud sinxronizatsiyasini qo'llab-quvvatlash tufayli Apple ilovalari uchun standart bo'lib qolmoqda.
Keng tarqalgan noto'g'ri tushuncha — Core Data ni ma'lumotlar bazasi deb hisoblash. Freymvork to'g'ridan-to'g'ri SQL so'rovlarini bajarmaydi va MBT emas. Core Data — bu obyektlarni boshqarish qatlami (object graph management) bo'lib, saqlash uchun SQLite, Binary yoki In-Memory dan foydalanishi mumkin. O'xshatish: Core Data Apple ekotizimi uchun Hibernate yoki Entity Framework kabi ORM, uning ostidagi SQLite esa Hibernate ostidagi MySQL kabidir.
Core Data steki to'rtta o'zaro bog'langan komponentdan iborat: NSManagedObjectModel (ma'lumotlar sxemasi), NSPersistentStoreCoordinator (saqlash koordinatori), NSManagedObjectContext (ish konteksti) va NSPersistentContainer (iOS 10 dan boshlab uchalasini birlashtiruvchi yagona konteyner). NSPersistentContainer stekni yaratish va sozlashni avtomatlashtiradi.
Har bir komponent qat'iy belgilangan funksiyani bajaradi. NSManagedObjectModel ob'ektlar tavsifi bilan .xcdatamodeld faylini yuklaydi. NSPersistentStoreCoordinator modelni fizik saqlash fayli (SQLite) bilan bog'laydi. NSManagedObjectContext obyektlar bilan ishlash uchun vaqtinchalik maydonni ta'minlaydi. Container hamma narsani bitta initializatsiya chaqiruvida birlashtiradi.
SQLite (NSSQLiteStoreType) — ko'pchilik ilovalarda ishlatiladigan standart saqlash. Ma'lumotlar ACID tranzaksiyalarini qo'llab-quvvatlash bilan bitta .sqlite faylida saqlanadi. Binary (NSBinaryStoreType) — kichik ma'lumotlar to'plamlari (bir necha yuz obyektgacha) uchun ikkilik formatdagi saqlash. In-Memory (NSInMemoryStoreType) — diskka saqlanmasdan operativ xotirada vaqtinchalik saqlash, testlar va kesh uchun ishlatiladi.
| Saqlash turi | Format | Unumdorlik | Qachon ishlatish kerak |
|---|---|---|---|
| SQLite | .sqlite | Yuqori | Production uchun standart tanlov |
| Binary | .binary | O'rtacha | Kichik ma'lumotlar to'plamlari |
| In-Memory | RAM | Maksimal | Testlar, kesh, vaqtinchalik ma'lumotlar |
| CloudKit | iCloud | Tarmoqqa bog'liq | Qurilmalar o'rtasida sinxronizatsiya |
Saqlashni tanlash NSPersistentStoreDescription initializatsiyasida bitta qator bilan belgilanadi. Ishlab chiquvchi saqlashni SQLite dan In-Memory ga (birlik testlar uchun) yoki CloudKit ga (iCloud sinxronizatsiyasi uchun) obyektlar bilan ishlash kodini o'zgartirmasdan o'zgartirishi mumkin — Core Data saqlash turlari orasidagi farqni yagona kontekst API si bilan abstraksiya qiladi.
NSManagedObject — bitta ob'ekt yozuvini ifodalovchi barcha Core Data obyektlari uchun asosiy sinf. Har bir boshqariladigan obyekt noyob NSManagedObjectID (doimiy identifikator) ga ega, kontekstga bog'langan va KVO (Key-Value Observing) orqali o'z o'zgarishlarini kuzatadi. Ishlab chiquvchi ob'ektning tipli xususiyatlarini aniqlash uchun NSManagedObject ning kichik sinflarini yaratadi.
NSManagedObjectContext — barcha obyekt operatsiyalari uchun ish maydonini ta'minlovchi Core Data ning markaziy komponenti. Kontekst obyektlarning qo'shilishi, o'chirilishi va o'zgartirilishini kuzatadi (change tracking), undoManager orqali operatsiyalarni bekor qilishni qo'llab-quvvatlaydi va saqlash bildirishnomalarini olganda boshqa kontekstlardan o'zgarishlarni avtomatik birlashtiradi.
Xususiy navbatlar qoidasi: NSManagedObjectContext .privateQueueConcurrencyType yoki .mainQueueConcurrencyType turi bilan yaratiladi. Asosiy kontekst asosiy UI oqimiga bog'langan, xususiy kontekstlar fon navbatlarida bajariladi. Har bir kontekst faqat o'z navbatida ishlatilishi kerak — boshqariladigan obyektga boshqa oqimdan murojaat qilish crash ga sabab bo'ladi. parentContext asinxron yozish uchun kontekstlar iyerarxiyasini tashkil qilish imkonini beradi.
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 avtomatik ravishda viewContext (main queue) yaratadi va fon operatsiyalari uchun newBackgroundContext() ni ta'minlaydi. automaticallyMergesChangesFromParent = true xususiyati viewContext ni fon kontekstlaridagi o'zgarishlarni ular saqlanganda avtomatik qabul qilishga majbur qiladi, ma'lumotlarni qo'lda qayta so'ramasdan UI ni yangilaydi.
NSPersistentStoreCoordinator fizik ma'lumotlar saqlashni boshqaradi: faylni ochadi, model asosida SQLite jadvallarini yaratadi, sxema o'zgarishida migratsiyalarni bajaradi. NSSQLiteStoreType turi bilan NSPersistentStoreDescription initializatsiyasida Core Data .xcdatamodeld modeliga mos sxema bilan SQLite faylini yaratadi.
Core Data SELECT/INSERT/UPDATE orqali standart SQL so'rovlaridan foydalanmaydi. Buning o'rniga u model va NSFetchRequest so'rovlari asosida ichki SQL buyruqlarini yaratadi. Ishlab chiquvchi so'rov unumdorligini tuzatish uchun -com.apple.CoreData.SQLDebug 1 ishga tushirish argumenti orqali SQL jurnallarini yoqishi mumkin.
Yengil migratsiya (Lightweight Migration) — yangi atributlar qo'shilganda, optional/required o'zgartirilganda yoki renamingID yordamida nom o'zgartirilganda SQLite sxemasini avtomatik yangilash jarayoni. Og'ir migratsiya ob'ektlarni birlashtirish yoki bo'lish kabi sxemaning tubdan o'zgarishida talab qilinadi va maxsus NSMigrationManager orqali amalga oshiriladi.
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)") }
}
Avtomatik migratsiyani NSMigratePersistentStoresAutomaticallyOption va NSInferMappingModelAutomaticallyOption orqali sozlash Core Data ga modelning yangi versiyasida atributlar yoki ob'ektlar qo'shilganda SQLite faylini mustaqil yangilash imkonini beradi. Agar migratsiya imkonsiz bo'lsa, store coordinator sabab tavsifi bilan xato chiqaradi — ishlab chiquvchi NSMigrationManager orqali maxsus migratsiyani amalga oshirishi kerak.
NSFetchRequest — Core Data dan obyektlarni olish uchun asosiy vosita. So'rov ob'ekt nomi, predikat (filtr), saralash, limit va ofset (offset) ni o'z ichiga oladi. Natija NSManagedObject yoki tipli kichik sinflar massivi sifatida qaytariladi. NSPredicate AND, OR, IN, LIKE va quyi so'rovlar bilan murakkab shartlarni qo'llab-quvvatlaydi.
NSBatchDeleteRequest — har bir obyektni xotiraga yuklamasdan ommaviy o'chirishning samarali usuli. So'rov managed object context ni chetlab o'tib SQLite darajasida bajariladi va faqat tugagandan so'ng kontekstni yangilaydi. Yangilash (NSBatchUpdateRequest) va qo'shish (NSBatchInsertRequest) uchun ham o'xshash ommaviy so'rovlar mavjud.
CRUD (Create, Read, Update, Delete) Core Data da kontekst metodlari orqali bajariladi: insert, fetch, save va delete. Barcha o'zgarishlar context.save() chaqirilgunga qadar vaqtinchalik — metod o'zgarishlarni doimiy SQLite saqlashda saqlaydi. Saqlash xatosida kontekst qayta urinish uchun o'zgartirilgan holatda qoladi.
let context = container.viewContext
// Yaratish
let user = User(context: context)
user.id = 42
user.name = "Alice"
// O'qish
let request = User.fetchRequest()
request.predicate = NSPredicate(format: "name CONTAINS %@", "Ali")
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
let results = try context.fetch(request)
// Yangilash
results.first?.name = "Alice Updated"
// O'chirish
if let first = results.first { context.delete(first) }
// Saqlash
try context.save()
Kontekstni saqlash (context.save()) — muhim operatsiya. Agar saqlash chaqirilmasa, barcha o'zgarishlar faqat xotirada qoladi. Kontekst saqlashdan oldin tekshirilishi mumkin bo'lgan hasChanges holatini kuzatadi. Fon operatsiyalari uchun o'z saqlashi bilan newBackgroundContext dan foydalaning, UI uchun esa taymer bo'yicha yoki ilova fonda ketganda avtomatik saqlash bilan viewContext dan foydalaning.
Birinchi amaliyot — foydalanuvchi qurilmalari o'rtasida iCloud orqali ma'lumotlarni sinxronlash uchun NSPersistentCloudKitContainer dan foydalaning. Bulut sinxronizatsiyasi saqlash tavsifiga CloudKit opsiyasini qo'shish orqali yoqiladi. Core Data sinxronizatsiya vaqtida nizolarni avtomatik boshqaradi va boshqa qurilmalardan o'zgarishlarni birlashtiradi.
Ikkinchi amaliyot — katta jadvallarda predikatsiz fetchRequest dan saqlaning. Har bir shartsiz so'rov barcha ob'ekt obyektlarini xotiraga yuklaydi, bu esa yuqori RAM sarfiga va UI ning sekinlashishiga olib keladi. Har doim predikatlar va limitlardan foydalaning. Sahifalash uchun NSFetchRequest da fetchLimit va fetchOffset ni qo'llang.
Uchinchi amaliyot — ko'p oqimli kirishda nizolarni hal qilish uchun mergePolicy ni sozlang. NSMergeByPropertyObjectTrumpMergePolicy oxirgi saqlangan kontekstdan nizoli xususiyatlarni yangilaydi. NSRollbackMergePolicy nizo vaqtida joriy kontekstdagi o'zgarishlarni bekor qiladi. Siyosat tanlovi ilovaning biznes mantiqiga bog'liq.
To'rtinchi amaliyot — jadvallar va to'plamlar bilan integratsiya uchun NSFetchedResultsController dan foydalaning. U avtomatik ravishda NSManagedObjectContextDidSave bildirishnomalariga obuna bo'ladi, faqat kerakli obyektlarni yuklaydi (faulting) va UITableView animatsiyasi uchun tegishli indeks yo'llari bilan kiritish, o'chirish va ko'chirishlar haqida delegatni xabardor qiladi.
Faulting — Core Data obyektlarini kechiktirib yuklash mexanizmi. So'rov bilan qaytarilgan boshqariladigan obyekt fault holatida — uning atributlari to'liq yuklanmagan, faqat identifikator yuklangan. To'liq yuklash (fire fault) istalgan atributga birinchi murojaatda sodir bo'ladi. Relationship prefetching (setRelationshipKeyPathsForPrefetching) bog'liq obyektlarni oldindan yuklaydi, N+1 so'rovlaridan qochadi.
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 ni ma'lumotlarni bir vaqtning o'zida butun jadvalni yuklamasdan, 20 tadan obyektlar qismlarida (ekranda ko'rsatish uchun) yuklashga majbur qiladi. returnsObjectsAsFaults = false bayrog'i barcha foydalanuvchilarning atributlari darhol yuklanishini kafolatlaydi, bu to'g'ridan-to'g'ri ko'rsatishda foydalidir. "posts" munosabatining prefetching i postlarga murojaat qilganda har bir foydalanuvchi uchun alohida so'rovlardan qochadi.
Tez-tez so'raladigan savollar
Yo'q, Core Data obyekt grafigini boshqarish freymvorkidir. U obyektlar bilan ishlash, o'zgarishlarni kuzatish va ularni saqlash uchun API ta'minlaydi. Core Data ostidagi ma'lumotlar bazasini (standart sifatida SQLite) freymvorkning o'zi bilan aralashtirmang. Core Data ORM, MBT emas.
Ha, Core Data uch turdagi saqlashni qo'llab-quvvatlaydi: SQLite, Binary va In-Memory. Saqlash tanlovi NSPersistentStoreDescription orqali belgilanadi. In-Memory saqlash ma'lumotlarni diskka saqlamaydi va birlik testlari uchun mos keladi. Binary saqlash — ixcham obyekt to'plamlari uchun eskirgan format.
Yengil migratsiya uchun NSMigratePersistentStoresAutomaticallyOption va NSInferMappingModelAutomaticallyOption ni yoqing. Murakkab o'zgarishlar uchun Xcode orqali Mapping Model (.xcmappingmodel) yarating. CloudKit saqlash (NSPersistentCloudKitContainer) sxema iCloud serveri bilan sinxronlanganda migratsiyalarni avtomatik qo'llab-quvvatlaydi.
SwiftData — Swift Macros va Swift Concurrency dan foydalanib Core Data ustida qurilgan yangi Apple freymvorki (iOS 17+). SwiftData sintaksis jihatidan soddaroq: ob'ektlar @Model makrosi bilan, kontekst @Environment(\.modelContext) bilan tavsiflanadi. SwiftData ostida xuddi shu Core Data steki va SQLite ishlatiladi.
Ishga tushirish argumentini -com.apple.CoreData.SQLDebug 1 yoqing — Core Data barcha SQL so'rovlari va ularning davomiyligini Xcode konsolida ko'rsatadi. Profillash uchun Core Data shabloni bilan Instruments dan foydalaning, bu fault so'rovlari sonini, obyekt yuklanishini va kontekst saqlash vaqtini ko'rsatadi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.