Core Data — əsas anlayışlar, NSManagedObject və arxitektura

Müəllif: IT Sectr Dərc olunub: 2026-03-11 Oxuma vaxtı: 11 dəq

Core Data — iOS və macOS tətbiqlərində obyekt qrafını idarə etmək üçün Apple freymvorku. O, məlumatların saxlanmasını, dəyişikliklərin izlənməsini, əməliyyatların ləğvini və UI ilə NSFetchedResultsController vasitəsilə inteqrasiyanı təmin edir. Apple Developer (2025) sənədlərinə görə, Core Data verilənlər bazası deyil — bu, obyektlərin yüklənməsi və saxlanması üçün standart olaraq SQLite-dən istifadə edən obyekt modelləşdirmə səviyyəsidir.

Əsas məqamlar

  • Core Data — iOS/macOS üçün ORM freymvorku, obyekt qrafını və onların daimi yaddaşda saxlanmasını idarə edir.
  • NSManagedObjectModel — Core Data modelində varlıqları, atributları və obyektlər arasındakı əlaqələri təsvir edən məlumat sxemi.
  • NSManagedObjectContext — dəyişikliklərin izlənməsi ilə obyektlərin yaradılması, oxunması, yenilənməsi və silinməsi üçün iş sahəsi.
  • NSPersistentContainer — iOS 10+-da modeli, konteksti və yaddaşı birləşdirən vahid giriş nöqtəsi.
  • NSFetchedResultsController — Core Data-nı UITableView/UICollectionView ilə avtomatik yeniləmə ilə inteqrasiya etmək üçün sinif.

Core Data nədir?

Core Data — Apple-ın Cocoa Touch SDK-nın tərkibinə daxil olan obyekt qrafının idarə edilməsi və məlumatların davamlılığı freymvorkudur. O, məlumatlarla işləmək üçün obyekt yönümlü interfeys təmin edir: tərtibatçı varlıqlar (Entity), atributlar və əlaqələr (Relationship) ilə işləyir, Core Data isə bu obyektləri arxa planda relyasiya verilənlər bazası qeydlərinə çevirir.

Core Data Mac OS X 10.4 Tiger (2005)-də macOS üçün təqdim edilmiş və iOS 3.0 (2009)-a port edilmişdir. 20 ildən çox müddətdə freymvork SQLite üzərində sadə abstraksiya səviyyəsindən NSPersistentCloudKitContainer vasitəsilə bulud sinxronizasiyası, kontekstlərin avtomatik idarə edilməsi ilə çoxaxınlıq və Swift Concurrency ilə asinxron yükləmə dəstəyi olan tam stekə çevrilmişdir.

Slack Community (2025) iOS tərtibatçıları sorğusuna görə, Core Data lokal məlumat saxlanması üçün kommersiya iOS tətbiqlərinin 68%-də istifadə olunur. Mürəkkəblik və çoxqatlılığa görə tənqid olunmasına baxmayaraq, freymvork sistemlə sıx inteqrasiya, sıfır xərc (SDK-ya daxildir) və iCloud sinxronizasiyası dəstəyi sayəsində Apple tətbiqləri üçün standart olaraq qalır.

Core Data verilənlər bazası deyil

Yaygın yanlış anlama — Core Data-nı verilənlər bazası hesab etmək. Freymvork birbaşa SQL sorğularını icra etmir və VTİ deyil. Core Data — obyektlərin idarə edilməsi qatıdır (object graph management) və davamlılıq üçün SQLite, Binary və ya In-Memory yaddaşından istifadə edə bilər. Bənzətmə: Core Data Apple ekosistemi üçün Hibernate və ya Entity Framework kimidir, altındakı SQLite isə Hibernate altındakı MySQL kimidir.

Core Data arxitekturası: steklər və komponentlər

Core Data steki dörd qarşılıqlı əlaqəli komponentdən ibarətdir: NSManagedObjectModel (məlumat sxemi), NSPersistentStoreCoordinator (yaddaş koordinatoru), NSManagedObjectContext (iş konteksti) və NSPersistentContainer (iOS 10-dan etibarən hər üçünü birləşdirən vahid konteyner). NSPersistentContainer stekin yaradılmasını və konfiqurasiyasını avtomatlaşdırır.

Hər komponent ciddi şəkildə müəyyən edilmiş funksiyanı yerinə yetirir. NSManagedObjectModel varlıqların təsviri ilə .xcdatamodeld faylını yükləyir. NSPersistentStoreCoordinator modeli fiziki yaddaş faylı (SQLite) ilə əlaqələndirir. NSManagedObjectContext obyektlərlə işləmək üçün müvəqqəti sahə təmin edir. Container hər şeyi bir inisializasiya çağırışında birləşdirir.

Core Data yaddaş növləri

SQLite (NSSQLiteStoreType) — əksər tətbiqlərdə istifadə olunan standart yaddaş. Məlumatlar ACID əməliyyatları dəstəyi ilə bir .sqlite faylında saxlanılır. Binary (NSBinaryStoreType) — kiçik məlumat dəstləri (bir neçə yüz obyektə qədər) üçün ikili formatda yaddaş. In-Memory (NSInMemoryStoreType) — disklə saxlanmadan operativ yaddaşda müvəqqəti yaddaş, testlər və keş üçün istifadə olunur.

Yaddaş növüFormatPerformansNə zaman istifadə edilməli
SQLite.sqliteYüksəkProduction üçün standart seçim
Binary.binaryOrtaKiçik məlumat dəstləri
In-MemoryRAMMaksimalTestlər, keş, müvəqqəti məlumatlar
CloudKitiCloudŞəbəkədən asılıdırCihazlar arası sinxronizasiya

Yaddaş seçimi NSPersistentStoreDescription-ın inisializasiyasında tək bir sətirlə təyin edilir. Tərtibatçı yaddaşı SQLite-dən In-Memory-ə (vahid testlər üçün) və ya CloudKit-ə (iCloud sinxronizasiyası üçün) obyektlərlə iş kodunu dəyişmədən keçirə bilər — Core Data vahid kontekst API-si ilə yaddaş növləri arasındakı fərqi abstraksiya edir.

NSManagedObject və NSManagedObjectContext

NSManagedObject — bir varlıq qeydini təmsil edən bütün Core Data obyektləri üçün əsas sinif. Hər bir managed obyektin unikal NSManagedObjectID (daimi identifikator) var, kontekstə bağlıdır və KVO (Key-Value Observing) vasitəsilə dəyişikliklərini izləyir. Tərtibatçı varlığın tipli xassələrini təyin etmək üçün NSManagedObject-in alt siniflərini yaradır.

NSManagedObjectContext — bütün obyekt əməliyyatları üçün iş sahəsi təmin edən Core Data-nın mərkəzi komponenti. Kontekst obyektlərin əlavə edilməsini, silinməsini və dəyişdirilməsini izləyir (change tracking), undoManager vasitəsilə əməliyyatların ləğvini dəstəkləyir və yaddaş bildirişləri aldıqda digər kontekstlərdən dəyişiklikləri avtomatik birləşdirir.

Kontekstlərin axın təhlükəsizliyi

Özəl növbələr qaydası: NSManagedObjectContext .privateQueueConcurrencyType və ya .mainQueueConcurrencyType növü ilə yaradılır. Əsas kontekst əsas UI axınına bağlıdır, özəl kontekstlər fon növbələrində icra olunur. Hər kontekst yalnız öz növbəsində istifadə edilməlidir — managed obyektə başqa axından müraciət etmək crash-ə səbəb olur. parentContext asinxron yazma üçün kontekstlər iyerarxiyasını təşkil etməyə imkan verir.

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 olaraq viewContext (main queue) yaradır və fon əməliyyatları üçün newBackgroundContext() təmin edir. automaticallyMergesChangesFromParent = true xassəsi viewContext-in fon kontekstlərindən dəyişiklikləri avtomatik qəbul etməsini təmin edir, məlumatların əl ilə yenidən sorğulanması olmadan UI-ni yeniləyir.

Persistent Store və SQLite ilə əlaqə

NSPersistentStoreCoordinator fiziki məlumat yaddaşını idarə edir: faylı açır, model əsasında SQLite cədvəlləri yaradır, sxem dəyişikliyi zamanı miqrasiyaları icra edir. NSSQLiteStoreType növü ilə NSPersistentStoreDescription inisializasiyası zamanı Core Data .xcdatamodeld modelinə uyğun sxemlə SQLite faylı yaradır.

Core Data SELECT/INSERT/UPDATE vasitəsilə standart SQL sorğularından istifadə etmir. Bunun əvəzinə model və NSFetchRequest sorğuları əsasında daxili SQL əmrləri yaradır. Tərtibatçı sorğu performansının debug edilməsi üçün -com.apple.CoreData.SQLDebug 1 işəsalma arqumenti ilə SQL loqlarını aktivləşdirə bilər.

Core Data miqrasiyaları

Yüngül miqrasiya (Lightweight Migration) — yeni atributlar əlavə edilərkən, optional/required dəyişdirilərkən və ya renamingID ilə ad dəyişdirilərkən SQLite sxeminin avtomatik yenilənməsi prosesi. Ağır miqrasiya varlıqların birləşdirilməsi və ya bölünməsi kimi sxemin köklü dəyişikliklərində tələb olunur və xüsusi NSMigrationManager vasitəsilə icra edilir.

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 miqrasiyanın NSMigratePersistentStoresAutomaticallyOption və NSInferMappingModelAutomaticallyOption vasitəsilə konfiqurasiyası Core Data-ya modelin yeni versiyasında atributlar və ya varlıqlar əlavə edilərkən SQLite faylını müstəqil yeniləməyə imkan verir. Miqrasiya mümkün deyilsə, store coordinator səbəbin təsviri ilə xəta atır — tərtibatçı NSMigrationManager vasitəsilə xüsusi miqrasiya həyata keçirməlidir.

Core Data praktikada: kod və nümunələr

NSFetchRequest — Core Data-dan obyektlərin seçilməsi üçün əsas vasitə. Sorğu varlıq adı, predikat (filtr), sıralama, limit və ofset (offset) ehtiva edir. Nəticə NSManagedObject və ya tipli alt siniflər massivi olaraq qaytarılır. NSPredicate AND, OR, IN, LIKE və alt sorğularla mürəkkəb şərtləri dəstəkləyir.

NSBatchDeleteRequest — hər obyekti yaddaşa yükləmədən kütləvi silmənin səmərəli üsulu. Sorğu managed object context-i keçərək SQLite səviyyəsində icra olunur və yalnız tamamlandıqdan sonra konteksti yeniləyir. Yeniləmə (NSBatchUpdateRequest) və əlavə etmə (NSBatchInsertRequest) üçün də oxşar toplu sorğular mövcuddur.

CRUD əməliyyatları nümunəsi

CRUD (Create, Read, Update, Delete) Core Data-da kontekst metodları vasitəsilə icra olunur: insert, fetch, save və delete. Bütün dəyişikliklər context.save() çağırışına qədər müvəqqətidir — metod dəyişiklikləri daimi SQLite yaddaşında saxlayır. Yaddaş xətası zamanı kontekst təkrar cəhd üçün dəyişdirilmiş vəziyyətdə qalır.

swift
let context = container.viewContext

// Yarat
let user = User(context: context)
user.id = 42
user.name = "Alice"

// Oxu
let request = User.fetchRequest()
request.predicate = NSPredicate(format: "name CONTAINS %@", "Ali")
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
let results = try context.fetch(request)

// Yenilə
results.first?.name = "Alice Updated"

// Sil
if let first = results.first { context.delete(first) }

// Saxla
try context.save()

Kontekstin saxlanması (context.save()) — kritik əməliyyat. Saxlama çağırılmazsa, bütün dəyişikliklər yalnız yaddaşda qalır. Kontekst yaddaşdan əvvəl yoxlanıla bilən hasChanges vəziyyətini izləyir. Fon əməliyyatları üçün öz saxlaması ilə newBackgroundContext, UI üçün isə taymer və ya tətbiq fonuna keçərkən avtomatik saxlama ilə viewContext istifadə edin.

Core Data ən yaxşı təcrübələri

Birinci təcrübə — istifadəçi cihazları arasında məlumat sinxronizasiyası üçün NSPersistentCloudKitContainer-dan istifadə edin. Bulud sinxronizasiyası yaddaş təsvirinə CloudKit seçiminin əlavə edilməsi ilə aktivləşdirilir. Core Data sinxronizasiya zamanı konfliktləri avtomatik idarə edir və digər cihazlardan dəyişiklikləri birləşdirir.

İkinci təcrübə — böyük cədvəllərdə predikatsız fetchRequest-dən qaçının. Hər bir şərtsiz sorğu bütün varlıq obyektlərini yaddaşa yükləyir, bu da yüksək RAM istehlakına və UI-nin yavaşlamasına səbəb olur. Həmişə predikatlar və limitlər istifadə edin. Səhifələmə üçün NSFetchRequest-də fetchLimit və fetchOffset tətbiq edin.

Üçüncü təcrübə — çoxaxınlı giriş zamanı konfliktlərin həlli üçün mergePolicy konfiqurasiya edin. NSMergeByPropertyObjectTrumpMergePolicy son saxlanmış kontekstdən konfliktli xassələri yeniləyir. NSRollbackMergePolicy konflikt zamanı cari kontekstdəki dəyişiklikləri ləğv edir. Siyasət seçimi tətbiqin biznes məntiqindən asılıdır.

Dördüncü təcrübə — cədvəl və kolleksiyalarla inteqrasiya üçün NSFetchedResultsController istifadə edin. O, avtomatik olaraq NSManagedObjectContextDidSave bildirişlərinə abunə olur, yalnız zəruri obyektləri yükləyir (faulting) və UITableView animasiyası üçün müvafiq indeks yolları ilə daxiletmə, silmə və daşımalar barədə delegatı məlumatlandırır.

Performans: prefetching və faulting

Faulting — Core Data obyektlərinin tənbəl yükləmə mexanizmi. Sorğu ilə qaytarılan managed obyekt fault vəziyyətindədir — onun atributları tam deyil, yalnız identifikator yüklənib. Tam yükləmə (fire fault) istənilən atributa ilk müraciət zamanı baş verir. Relationship prefetching (setRelationshipKeyPathsForPrefetching) əlaqəli obyektləri əvvəlcədən yükləyir, N+1 sorğularından qaçır.

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-nı məlumatları bir dəfəyə bütün cədvəli yükləmədən, 20 obyektlik hissələrlə (ekranda göstərmək üçün) yükləməyə məcbur edir. returnsObjectsAsFaults = false bayrağı bütün istifadəçilərin atributlarının dərhal yüklənməsinə zəmanət verir, bu da birbaşa göstərim zamanı faydalıdır. "posts" əlaqəsinin prefetching-i postlara müraciət edərkən hər istifadəçi üçün ayrıca sorğulardan qaçır.

Tez-tez verilən suallar

Core Data verilənlər bazasıdırmı?

Xeyr, Core Data obyekt qrafının idarə edilməsi freymvorkudur. O, obyektlərlə işləmək, dəyişiklikləri izləmək və onları saxlamaq üçün API təmin edir. Core Data-nın altındakı verilənlər bazasını (standart olaraq SQLite) freymvorkun özü ilə qarışdırmayın. Core Data ORM-dir, VTİ deyil.

Core Data-nı SQLite olmadan istifadə etmək olar?

Bəli, Core Data üç növ yaddaşı dəstəkləyir: SQLite, Binary və In-Memory. Yaddaş seçimi NSPersistentStoreDescription vasitəsilə təyin edilir. In-Memory yaddaşı məlumatları disklə saxlamır və vahid testlər üçün uyğundur. Binary yaddaşı — yığcam obyekt dəstləri üçün köhnəlmiş formatdır.

Core Data-nı modelin yeni versiyasına necə köçürmək olar?

Yüngül miqrasiya üçün NSMigratePersistentStoresAutomaticallyOption və NSInferMappingModelAutomaticallyOption-ı aktivləşdirin. Mürəkkəb dəyişikliklər üçün Xcode vasitəsilə Mapping Model (.xcmappingmodel) yaradın. CloudKit yaddaşı (NSPersistentCloudKitContainer) sxemin iCloud serveri ilə sinxronizasiyası zamanı miqrasiyaları avtomatik dəstəkləyir.

Core Data SwiftData-dan nə ilə fərqlənir?

SwiftData — Swift Macros və Swift Concurrency istifadə edərək Core Data üzərində qurulmuş yeni Apple freymvorkudur (iOS 17+). SwiftData sintaksis baxımından daha sadədir: varlıqlar @Model makrosu ilə, kontekst isə @Environment(\.modelContext) ilə təsvir olunur. SwiftData altında eyni Core Data steki və SQLite istifadə olunur.

Core Data-nın yavaş sorğularını necə debug etmək olar?

İşəsalma arqumentini -com.apple.CoreData.SQLDebug 1 aktivləşdirin — Core Data bütün SQL sorğularını və onların müddətini Xcode konsolunda göstərəcək. Profilləşdirmə üçün Core Data şablonu ilə Instruments istifadə edin, bu, fault sorğularının sayını, obyekt yüklənməsini və kontekst saxlama müddətini göstərir.

Nəticə

  • Core Data — iOS və macOS üçün obyekt qrafının idarə edilməsi və məlumat davamlılığı freymvorku, standart yaddaş kimi SQLite istifadə edir.
  • Core Data steki vahid konfiqurasiya üçün NSManagedObjectModel, NSPersistentStoreCoordinator, NSManagedObjectContext və NSPersistentContainer daxildir.
  • NSManagedObjectContext — dəyişikliklərin izlənməsi, ləğv dəstəyi və fon kontekstlərindən avtomatik birləşdirmə ilə iş sahəsi.
  • NSFetchRequest NSPredicate və prefetching ilə — batch size və faulting vasitəsilə optimallaşdırma ilə əsas seçim aləti.
  • Lightweight Migration modelin yeni versiyasında Core Data atributları və varlıqları əlavə edilərkən SQLite sxemini avtomatik yeniləyir.
  • NSPersistentCloudKitContainer konfliktlərin avtomatik həlli ilə istifadəçi cihazları arasında iCloud sinxronizasiyası əlavə edir.
  • Tövsiyə — iyerarxik obyekt modelləri olan iOS tətbiqləri üçün Core Data istifadə edin, sadə lokal saxlama üçün isə GRDB və ya SwiftData-ya baxın.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun