Core Data — asosiy tushunchalar, NSManagedObject va arxitektura

Muallif: IT Sectr Nashr etilgan: 2026-03-11 O'qish vaqti: 11 daq

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 — iOS/macOS uchun ORM freymvorki, obyekt grafigini va ularni doimiy saqlashni boshqaradi.
  • NSManagedObjectModel — Core Data modelidagi ob'ektlar, atributlar va munosabatlarni tavsiflovchi ma'lumotlar sxemasi.
  • NSManagedObjectContext — o'zgarishlarni kuzatish bilan obyektlarni yaratish, o'qish, yangilash va o'chirish uchun ish maydoni.
  • NSPersistentContainer — iOS 10+ da model, kontekst va saqlashni birlashtiruvchi yagona kirish nuqtasi.
  • NSFetchedResultsController — Core Data ni UITableView/UICollectionView bilan avtomatik yangilanish bilan integratsiya qilish uchun sinf.

Core Data nima?

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.

Core Data ma'lumotlar bazasi emas

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 arxitekturasi: steklar va komponentlar

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.

Core Data saqlash turlari

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 turiFormatUnumdorlikQachon ishlatish kerak
SQLite.sqliteYuqoriProduction uchun standart tanlov
Binary.binaryO'rtachaKichik ma'lumotlar to'plamlari
In-MemoryRAMMaksimalTestlar, kesh, vaqtinchalik ma'lumotlar
CloudKitiCloudTarmoqqa bog'liqQurilmalar 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 va NSManagedObjectContext

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.

Kontekstlarning oqim xavfsizligi

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.

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 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.

Persistent Store va SQLite bilan bog'liqlik

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.

Core Data migratsiyalari

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.

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)") }
}

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.

Core Data amalda: kod va misollar

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 operatsiyalari namunasi

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.

swift
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.

Core Data eng yaxshi amaliyotlari

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.

Unumdorlik: prefetching va faulting

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.

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 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

Core Data ma'lumotlar bazasimi?

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.

Core Data ni SQLite siz ishlatish mumkinmi?

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.

Core Data ni modelning yangi versiyasiga qanday o'tkazish mumkin?

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.

Core Data SwiftData dan qanday farq qiladi?

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.

Core Data ning sekin so'rovlarini qanday tuzatish mumkin?

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

  • Core Data — iOS va macOS uchun obyekt grafigini boshqarish va ma'lumotlar saqlanishi freymvorki, standart saqlash sifatida SQLite dan foydalanadi.
  • Core Data steki yagona konfiguratsiya uchun NSManagedObjectModel, NSPersistentStoreCoordinator, NSManagedObjectContext va NSPersistentContainer ni o'z ichiga oladi.
  • NSManagedObjectContext — o'zgarishlarni kuzatish, bekor qilishni qo'llab-quvvatlash va fon kontekstlaridan avtomatik birlashtirish bilan ish maydoni.
  • NSFetchRequest NSPredicate va prefetching bilan — batch size va faulting orqali optimallashtirish bilan asosiy tanlash vositasi.
  • Lightweight Migration modelning yangi versiyasida Core Data atributlari va ob'ektlari qo'shilganda SQLite sxemasini avtomatik yangilaydi.
  • NSPersistentCloudKitContainer nizolarni avtomatik hal qilish bilan foydalanuvchi qurilmalari o'rtasida iCloud sinxronizatsiyasini qo'shadi.
  • Tavsiya — iyerarxik obyekt modellari bo'lgan iOS ilovalari uchun Core Data dan foydalaning, oddiy mahalliy saqlash uchun esa GRDB yoki SwiftData ni ko'rib chiqing.

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.

Loyihani muhokama qilish

Shuningdek o'qing