Core Data bu Apple tomonidan ishlab chiqilgan ma'lumotlarni boshqarish freymvorki bo'lib, iOS, macOS, tvOS va watchOS uchun obyekt-relatsion xaritalashni ta'minlaydi. U SQLite, XML yoki ikkilik ombor ustida ishlab, ilovadagi obyektlarni saqlash, olish va filtrlashni avtomatlashtiradi. Apple Core Data Documentation-ga ko'ra, freymvork saqlanuvchanlik stekini boshqarish uchun Managed Object Context va NSPersistentContainer tushunchalaridan foydalanadi.
Asosiy ma'lumotlar
Core Data — Cocoa Touch tarkibiga kiruvchi obyekt grafi va saqlanuvchanlikni boshqarish freymvorkidir. Keng tarqalgan noto'g'ri tushunchadan farqli o'laroq, Core Data ma'lumotlar bazasi emas, balki SQLite-ni omborlardan biri sifatida ishlata oladigan obyektlarni boshqarish qatlamidir. Core Data-ning asosiy vazifasi obyektlardagi o'zgarishlarni kuzatish, ularning hayotiy sikllarini boshqarish va holatni disk bilan sinxronlashtirishdir.
Freymvork obyekt grafini ta'minlaydi, bunda har bir Managed Object o'zgarishlar uchun kontekst tomonidan kuzatiladi. Kontekst saqlanganda, barcha o'zgartirilgan, qo'shilgan va o'chirilgan obyektlar bir tranzaksiya bilan doimiy omborda tasdiqlanadi. Bu dasturchini SQL so'rovlarini yozish va tranzaksiyalarni qo'lda boshqarishdan ozod qiladi.
Swift Developer Survey (2025) statistikasiga ko'ra, Core Data mahalliy ma'lumotlar bilan ishlaydigan iOS ilovalarining 52 foizida qo'llaniladi. Zamonaviy alternativalar (SwiftData, Realm) paydo bo'lishiga qaramay, Core Data yetukligi va tizim bilan chuqur integratsiyasi tufayli Apple-ning mavjud loyihalarida asosiy freymvork bo'lib qolmoqda.
Core Data-ni obyektlar o'rtasidagi aloqalar, o'zgarishlarni qaytarish va faulting mexanizmi orqali avtomatik keshlash talab qilinadigan o'rtacha murakkablikdagi ma'lumotlar modeli loyihalari uchun foydalaning.
Core Data arxitekturasi Managed Object Context tushunchasi atrofida qurilgan — obyektlardagi barcha o'zgarishlarni kuzatuvchi ish maydoni. Kontekst o'rnatilgan NSUndoManager orqali qaytarish (undo/redo) ni qo'llab-quvvatlaydi, bu holat snapshotlarini qo'lda saqlamasdan qoralamalar va harakatlarni bekor qilishni amalga oshirishga imkon beradi. save() chaqirilganda, kontekst barcha o'zgarishlarni bir tranzaksiya bilan doimiy omborda tasdiqlaydi, atomarlik va ma'lumotlar izchilligini kafolatlaydi.
Core Data ma'lumotlar modeli .xcdatamodeld faylida — Xcode vizual muharririda aniqlanadi, bu erda barcha Entity-lar, ularning atributlari va aloqalari tavsiflanadi. Kompilyatsiya paytida model .momd ga seriyalanadi va NSManagedObjectModel orqali yuklanadi.
Entity — SQL-dagi jadvalga o'xshash ma'lumot turining tavsifi. Har bir Entity ma'lumot turi (String, Integer, Date, Boolean, Data) bilan nomlangan maydonlar — Attributes to'plamini o'z ichiga oladi. Room-dan farqli o'laroq, Core Data har bir atribut uchun model muharriri orqali turni aniq tanlashni talab qiladi.
Relationship — SQL-dagi tashqi kalitga o'xshash Entity-lar o'rtasidagi aloqa. Core Data barcha aloqa turlarini qo'llab-quvvatlaydi: bir-birga, bir-ko'pga va ko'p-ko'pga. Har bir aloqa uchun Delete Rule (Cascade, Nullify, Deny) — bog'liq obyekt o'chirilganda xatti-harakat sozlanadi.
| Delete Rule | O'chirishdagi xatti-harakat | Qo'llash misoli |
|---|---|---|
| Cascade | Barcha bog'liq obyektlarni o'chiradi | Buyurtmani pozitsiyalar bilan birga o'chirish |
| Nullify | Teskari aloqani nolga tenglashtiradi | Kitoblarni o'chirmasdan muallifni o'chirish |
| Deny | Agar bog'liq obyektlar mavjud bo'lsa, o'chirishni bloklaydi | Mahsulotlar bilan kategoriyani o'chirishdan himoya |
Delete Rule tanlovi ma'lumotlar yaxlitligi uchun juda muhim: Cascade tekshiruvsiz bazaning uchdan bir qismini o'chirishi mumkin, Deny esa tushunarsiz xato bilan operatsiyani bloklashi mumkin. Ishlab chiqarish kodida yetim yozuvlarni qo'lda qayta ishlash bilan Nullify tavsiya etiladi.
Xcode model muharririda dasturchi nafaqat Entity va atributlarni, balki constraints (yagonalik cheklovlari), so'rovlarni tezlashtirish uchun indekslar va atributlar uchun default values ni ham sozlashi mumkin. Modeldagi barcha o'zgarishlar NSPersistentContainer ishga tushirilganda yuklanadigan .momd fayliga kompilyatsiya qilinadi. Model versiyalash (Model Versioning) sxemaning bir nechta versiyalarini saqlash va ular o'rtasida migratsiyani amalga oshirish imkonini beradi.
NSPersistentContainer — iOS 10 va macOS 10.12 dan boshlab Core Data stekini boshqaruvchi yagona obyekt. U NSManagedObjectModel, NSPersistentStoreCoordinator va NSManagedObjectContext ni inkapsulyatsiya qiladi, modelni yuklash va omborni sozlashni avtomatlashtiradi. Eski versiyalar uchun stek qo'lda qurilar edi, ammo hozir bu tavsiya etilmaydi.
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores { _, error in
if let error { fatalError("Core Data load failed: \(error)") }
}
let context = container.viewContext
viewContext — asosiy oqimga bog'langan asosiy kontekst. Barcha o'qish va UI yangilanishlari u orqali amalga oshiriladi. Ma'lumotlarni yozish unumdorlik uchun keyingi sinxronizatsiya bilan xususiy navbatdagi bola kontekstida bajarilishi tavsiya etiladi.
Koordinator NSPersistentStoreCoordinator modelni diskdagi fizik ombor bilan bog'laydi. Core Data bir nechta ombor turlarini qo'llab-quvvatlaydi: SQLite (tavsiya etilgan), Binary va In-Memory. SQLite ombori migratsiyalar, qo'shimcha zaxira nusxalash va yozish jarayonidagi nosozliklarga chidamlilikni qo'llab-quvvatlaydi.
NSFetchRequest — Core Data omboriga so'rovni tavsiflovchi obyekt. U Entity nomini, filtrlash predikatini, saralashni va olish sozlamalarini o'z ichiga oladi. So'rov context.fetch() orqali bajariladi va NSManagedObject massivini qaytaradi.
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 murakkab shartlarni qo'llab-quvvatlaydi: LIKE, IN, BETWEEN, CONTAINS[c] (registrga sezgirliksiz), bog'liq Entity-lar bo'yicha ichki so'rovlar uchun SUBQUERY. Core Data shuningdek NSFetchedResultsController — UITableView-da reaktiv ma'lumot yuklash sinfini qo'llab-quvvatlaydi, u avtomatik ravishda o'zgarishlarni kuzatadi va jadvalni animatsiyalangan bo'limlar bilan yangilaydi.
Core Data bilan ko'p oqimli ilovada ishlash qoidalarga qat'iy rioya qilishni talab qiladi: NSManagedObject to'g'ridan-to'g'ri oqimlar o'rtasida uzatilishi mumkin emas. Har bir oqim (yoki navbat) o'z kontekstidan foydalanishi kerak. Asosiy yondashuv — yozish uchun xususiy navbatli (NSPrivateQueueConcurrencyType) bola NSManagedObjectContext va o'qish uchun viewContext yaratishdir.
Bola kontekst ota-kontekstga, so'ngra ota-kontekst diskdagi omborga saqlanadi. Bu o'zgarishlarning asosiy oqimni bloklamasligini va UI har doim mergeChanges yoki saqlashda viewContext-ning avtomatik yangilanishi orqali izchil holatni ko'rishini kafolatlaydi.
Core Data faulting — bog'liq obyektlarni kechiktirilgan yuklash mexanizmidan foydalanadi. User olinayotganda uning addresses so'ralmasa, bog'liq Address-lar nuqtali notatsiya orqali murojaat qilinmaguncha yuklanmaydi. Faulting xotirani tejaydi va yuklashni tezlashtiradi, ammo fon kontekstlarida kirish nazorat qilinmasa, asosiy oqimda kutilmagan disk murojaatlariga sabab bo'lishi mumkin.
Samarali ko'p oqimlilik uchun obyektlarni xotiraga yuklamasdan ommaviy qo'shish va o'chirish uchun NSBatchInsertRequest va NSBatchDeleteRequest dan foydalaning — bu server bilan ma'lumot sinxronizatsiyasi uchun juda muhimdir.
Batch operatsiyalari kontekst va obyekt grafigini chetlab o'tib, to'g'ridan-to'g'ri NSPersistentStoreCoordinator darajasida bajariladi. Bu xotirada 10 000 NSManagedObject namunasini yaratmasdan bir necha millisekund ichida 10 000 yozuvni qo'shish imkonini beradi. Batch so'rovi bajarilgandan so'ng, UI yangi ma'lumotlarni aks ettirishi uchun kontekst mergeChangesFromContextDidSaveNotification orqali yangilanishi kerak. Apple batch operatsiyalarini dastlabki ma'lumot yuklash va server bilan tungi sinxronizatsiya uchun tavsiya qiladi.
Core Data-da o'zgarishlarni kuzatish uchun NSPersistentHistoryTracking ishlatiladi — har bir tranzaksiyani (qo'shish, yangilash, o'chirish) alohida tarixda qayd etuvchi mexanizm. History tracking-ni faollashtirish bir xil SQLite fayli bilan ishlaydigan turli jarayonlar va ilovalar o'rtasida ma'lumotlarni sinxronlashtirish imkonini beradi, masalan, asosiy ilova va Notification Service Extension o'rtasida. Faollashtirish persistentHistoryTrackingKey bayrog'i bilan NSPersistentStoreDescription orqali, o'qish esa sana va tranzaksiya turi bo'yicha filtr bilan NSPersistentHistoryChangeRequest orqali amalga oshiriladi.
Core Data unumdorligini disk raskadrovka va profilash uchun macOS-da Xcode-dagi Instruments to'plamidan Core Data Profiler vositasi ishlatiladi. U barcha olish, qo'shish, o'chirish va saqlash operatsiyalarini har bir operatsiyaning davomiyligi va jadvallarda hamda vaqt chizig'i grafiklarida yuklangan obyektlar soni bilan ko'rsatadi. Dasturchi muammoli joylarni aniqlashi mumkin: bir xil so'rovning bir necha marta olinishi (keshlashning yo'qligi), jadvalni aylantirishda fault-obyektlarning oqishi yoki bog'liq entity-larni sinxron yuklash tufayli asosiy oqimning bloklanishi. Profilashni haqiqiy qurilmada o'tkazish tavsiya etiladi, simulyatorda emas, chunki simulyatorning unumdorligi iPhone yoki iPad-dagi ilovaning haqiqiy xatti-harakatini aks ettirmaydi.
Tez-tez beriladigan savollar
Core Data — ma'lumotlar bazasi emas, balki SQLite-ni ombor sifatida ishlata oladigan obyektlarni boshqarish qatlamidir. To'g'ridan-to'g'ri SQLite-dan farqli o'laroq, Core Data obyekt o'zgarishlarini kuzatadi, qaytarishlarni boshqaradi va faulting va keshlash bilan obyekt grafi taqdim etadi. SQLite so'rovlar ustida ko'proq nazorat beradi, ammo SQL yozish va tranzaksiyalarni qo'lda boshqarishni talab qiladi.
Core Data buzuvchi bo'lmagan o'zgarishlar uchun yengil migratsiyani (Lightweight Migration) qo'llab-quvvatlaydi: atribut qo'shish, nomini o'zgartirish, standart qiymat o'rnatish. Murakkab o'zgarishlar uchun Mapping Model yaratiladi. Yengil migratsiya NSPersistentStoreDescription-dagi shouldMigrateAutomatically bayrog'i bilan yoqiladi.
Ha, Core Data SwiftUI bilan so'rovlar uchun @FetchRequest o'rash va o'zgarishlarga obuna bo'lish uchun @ObservedObject orqali integratsiyalanadi. SwiftUI ManagedObject o'zgarganda View-ni avtomatik yangilaydi, bu Core Data va SwiftUI-ni holatni boshqarish uchun mos stekga aylantiradi.
Fault — Core Data grafigidagi bog'liq obyektning ma'lumotlarini o'z ichiga olmaydigan yengil to'ldiruvchidir. Fault o'rnatilganda (refreshObject: orqali) ma'lumotlar xotiradan tushiriladi. Xususiyatga murojaat qilinganda fault avtomatik ravishda ombordan ma'lumotlar bilan to'ldiriladi — bu xotiradan foydalanishni optimallashtiruvchi kechiktirilgan yuklash mexanizmidir.
Test uchun In-Memory ombor turidan foydalaning: NSPersistentStoreDescription NSInMemoryStoreType bilan. Konteyner test to'plamidagi model bilan yaratiladi. Har bir testdan so'ng barcha obyektlarni o'chiring yoki konteynerni qayta yarating — bu test holatlarining bir-biridan izolyatsiyasini ta'minlaydi.
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.