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 — 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.
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 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.
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ü | Format | Performans | Nə zaman istifadə edilməli |
|---|---|---|---|
| SQLite | .sqlite | Yüksək | Production üçün standart seçim |
| Binary | .binary | Orta | Kiçik məlumat dəstləri |
| In-Memory | RAM | Maksimal | Testlər, keş, müvəqqəti məlumatlar |
| CloudKit | iCloud | Şəbəkədən asılıdır | Cihazlar 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 — 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.
Ö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.
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.
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.
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.
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.
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 (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.
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.
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.
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.
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
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.
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.
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.
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.
İşə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ə
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.
Həm də oxuyun