Core Data Apple tərəfindən məlumatların idarə edilməsi framework-üdür, iOS, macOS, tvOS və watchOS üçün obyekt-relasional xəritələmə təmin edir. O, SQLite, XML və ya ikili anbar üzərində işləyərək tətbiqdə obyektlərin saxlanması, çıxarılması və filtrasiyasını avtomatlaşdırır. Apple Core Data Documentation-ya görə, framework persistemlik yığınını idarə etmək üçün Managed Object Context və NSPersistentContainer anlayışlarından istifadə edir.
Əsas məqamlar
Core Data — Cocoa Touch-ın tərkibinə daxil olan obyekt qrafiki və persistemlik idarəetmə framework-üdür. Geniş yayılmış yanlış anlayışın əksinə, Core Data verilənlər bazası deyil, SQLite-dan anbarlardan biri kimi istifadə edə bilən obyekt idarəetmə təbəqəsidir. Core Data-nın əsas vəzifəsi obyektlərdəki dəyişiklikləri izləmək, onların həyat dövrünü idarə etmək və vəziyyəti disk ilə sinxronlaşdırmaqdır.
Framework obyekt qrafiki təmin edir, burada hər bir Managed Object dəyişikliklər üçün kontekst tərəfindən izlənir. Kontekst saxlanıldıqda, bütün dəyişdirilmiş, əlavə edilmiş və silinmiş obyektlər bir tranzaksiya ilə daimi anbarda təsdiqlənir. Bu, tərtibatçını SQL sorğuları yazmaqdan və tranzaksiyaları əl ilə idarə etməkdən azad edir.
Swift Developer Survey (2025) statistikasına görə, Core Data lokal məlumatlarla işləyən iOS tətbiqlərinin 52%-də istifadə olunur. Müasir alternativlərin (SwiftData, Realm) meydana çıxmasına baxmayaraq, Core Data yetkinliyi və sistemlə dərin inteqrasiyası sayəsində Apple-ın mövcud layihələrində əsas framework olaraq qalır.
Core Data-nı obyektlər arasında əlaqələr, dəyişikliklərin geri qaytarılması və faulting mexanizmi vasitəsilə avtomatik keşləmə tələb edən orta mürəkkəblikdə məlumat modeli layihələri üçün istifadə edin.
Core Data arxitekturası Managed Object Context konsepsiyası ətrafında qurulub — obyektlərdəki bütün dəyişiklikləri izləyən iş sahəsi. Kontekst daxili NSUndoManager vasitəsilə geri qaytarma (undo/redo) dəstəkləyir ki, bu da vəziyyət snapshot-larını əl ilə saxlamadan qaralama və əməliyyatların ləğvini həyata keçirməyə imkan verir. save() çağırıldıqda, kontekst bütün dəyişiklikləri bir tranzaksiya ilə daimi anbarda təsdiqləyir, atomarlıq və məlumat ardıcıllığını təmin edir.
Core Data məlumat modeli .xcdatamodeld faylında — Xcode-un vizual redaktorunda təyin edilir, burada bütün Entity-lər, onların atributları və əlaqələri təsvir olunur. Kompilasiya zamanı model .momd-ə seriyalaşdırılır və NSManagedObjectModel vasitəsilə yüklənir.
Entity — SQL-də cədvələ bənzər məlumat tipinin təsviridir. Hər Entity məlumat tipi (String, Integer, Date, Boolean, Data) olan adlandırılmış sahələr — Attributes dəsti ehtiva edir. Room-dan fərqli olaraq, Core Data hər bir atribut üçün model redaktoru vasitəsilə tipin açıq şəkildə seçilməsini tələb edir.
Relationship — SQL-də xarici açar kimi Entity-lər arasında əlaqədir. Core Data bütün əlaqə növlərini dəstəkləyir: bir-birə, bir-çoxa və çox-çoxa. Hər bir əlaqə üçün Delete Rule (Cascade, Nullify, Deny) — əlaqəli obyekt silindikdə davranış konfiqurasiya edilir.
| Delete Rule | Silinmə zamanı davranış | Tətbiq nümunəsi |
|---|---|---|
| Cascade | Bütün əlaqəli obyektləri silir | Sifarişin mövqelərlə birlikdə silinməsi |
| Nullify | Əks əlaqəni sıfırlayır | Kitabları silmədən müəllifin silinməsi |
| Deny | Əlaqəli obyektlər varsa silməni bloklayır | Məhsullarla kateqoriyanın silinməsindən qorunma |
Delete Rule seçimi məlumat bütövlüyü üçün kritikdir: Cascade yoxlanılmadan bazanın üçdə birini silə bilər, Deny isə anlaşılmaz xəta ilə əməliyyatı bloklaya bilər. İstehsalat kodunda yetim qeydlərin əl ilə işlənməsi ilə Nullify tövsiyə olunur.
Xcode model redaktorunda tərtibatçı təkcə Entity və atributları deyil, həmçinin constraints (unikallıq məhdudiyyətləri), sorğuları sürətləndirmək üçün indekslər və atributlar üçün default values təyin edə bilər. Modeldəki bütün dəyişikliklər NSPersistentContainer-ın inisializasiyası zamanı yüklənən .momd faylına kompilə olunur. Model versiyalaşdırması (Model Versioning) sxemin bir neçə versiyasını saxlamağa və onlar arasında miqrasiya aparmağa imkan verir.
NSPersistentContainer — iOS 10 və macOS 10.12-dən etibarən Core Data yığınını idarə edən vahid obyektdir. O, NSManagedObjectModel, NSPersistentStoreCoordinator və NSManagedObjectContext-i inkapsulyasiya edərək modelin yüklənməsini və anbar konfiqurasiyasını avtomatlaşdırır. Köhnə versiyalar üçün yığın əl ilə qurulurdu, lakin indi bu tövsiyə olunmur.
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores { _, error in
if let error { fatalError("Core Data load failed: \(error)") }
}
let context = container.viewContext
viewContext — əsas ipliklə əlaqəli əsas kontekst. Bütün oxuma və UI yeniləmələri onun vasitəsilə həyata keçirilir. Məlumatların yazılması performans üçün uşaq tipli fon kontekstində sonrakı sinxronizasiya ilə yerinə yetirilməsi tövsiyə olunur.
Koordinator NSPersistentStoreCoordinator modeli diskdəki fiziki anbarla əlaqələndirir. Core Data bir neçə anbar tipini dəstəkləyir: SQLite (tövsiyə olunan), Binary və In-Memory. SQLite anbarı miqrasiyaları, artımlı ehtiyat nüsxələri və yazma prosesində nasazlıqlara qarşı davamlılığı dəstəkləyir.
NSFetchRequest — Core Data anbarına sorğunu təsvir edən obyektdir. O, Entity adını, filtrasiya predikatını, sıralamanı və gətirmə parametrlərini ehtiva edir. Sorğu context.fetch() vasitəsilə icra olunur və NSManagedObject massivi qaytarır.
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 mürəkkəb şərtləri dəstəkləyir: LIKE, IN, BETWEEN, CONTAINS[c] (registr həssaslığı olmadan), əlaqəli Entity-lər üzrə iç-içə sorğular üçün SUBQUERY. Core Data həmçinin NSFetchedResultsController — UITableView-də reaktiv məlumat yükləmə sinfini dəstəkləyir, o, avtomatik olaraq dəyişiklikləri izləyir və cədvəli animasiya edilmiş bölmələrlə yeniləyir.
Core Data ilə çoxişlək tətbiqdə iş qaydalara ciddi riayət etməyi tələb edir: NSManagedObject birbaşa ipliklər arasında ötürülə bilməz. Hər bir iplik (və ya növbə) öz kontekstindən istifadə etməlidir. Əsas yanaşma — yazmaq üçün şəxsi növbəli (NSPrivateQueueConcurrencyType) uşaq NSManagedObjectContext və oxumaq üçün viewContext yaratmaqdır.
Uşaq kontekst valideynə, valideyn isə diskdəki anbara yazılır. Bu, dəyişikliklərin əsas ipliyi bloklamamasını və UI-nin mergeChanges və ya yazma zamanı viewContext-in avtomatik yenilənməsi vasitəsilə həmişə ardıcıl vəziyyət görməsini təmin edir.
Core Data faulting — əlaqəli obyektlərin gecikmiş yüklənmə mexanizmindən istifadə edir. User sorğulanarkən onun addresses tələb olunmursa, əlaqəli Address-lər nöqtə notasiyası vasitəsilə müraciət edilənə qədər yüklənmir. Faulting yaddaşa qənaət edir və yükləməni sürətləndirir, lakin fon kontekstlərində girişə nəzarət edilmədikdə əsas iplikdə gözlənilməz disk müraciətlərinə səbəb ola bilər.
Səmərəli çoxişləklik üçün obyektləri yaddaşa yükləmədən kütləvi əlavə etmə və silmə üçün NSBatchInsertRequest və NSBatchDeleteRequest-dən istifadə edin — bu, serverlə məlumat sinxronizasiyası üçün kritikdir.
Batch əməliyyatları kontekst və obyekt qrafikini yan keçərək birbaşa NSPersistentStoreCoordinator səviyyəsində icra olunur. Bu, yaddaşda 10 000 NSManagedObject nümunəsi yaratmadan bir neçə millisaniyə ərzində 10 000 qeyd daxil etməyə imkan verir. Batch sorğusu icra edildikdən sonra UI-nin yeni məlumatları əks etdirməsi üçün kontekst mergeChangesFromContextDidSaveNotification vasitəsilə yenilənməlidir. Apple batch əməliyyatlarını ilkin məlumat yükləməsi və serverlə gecə sinxronizasiyası üçün tövsiyə edir.
Core Data-da dəyişiklikləri izləmək üçün NSPersistentHistoryTracking istifadə olunur — hər bir tranzaksiyanı (əlavə etmə, yeniləmə, silmə) ayrıca tarixçədə qeyd edən mexanizm. History tracking-in aktivləşdirilməsi eyni SQLite faylı ilə işləyən müxtəlif proseslər və tətbiqlər arasında məlumatları sinxronlaşdırmağa imkan verir, məsələn, əsas tətbiq və Notification Service Extension arasında. Aktivasiya persistentHistoryTrackingKey bayrağı ilə NSPersistentStoreDescription vasitəsilə, oxuma isə tarix və tranzaksiya növünə görə filtr ilə NSPersistentHistoryChangeRequest vasitəsilə həyata keçirilir.
Core Data performansının debug və profilinqi üçün macOS-da Xcode alətlər dəstindən Core Data Profiler istifadə olunur. O, bütün gətirmə, əlavə etmə, silmə və yazma əməliyyatlarını hər bir əməliyyatın müddəti və cədvəllərdə və zaman xətti qrafiklərində yüklənmiş obyektlərin sayı ilə göstərir. Tərtibatçı problemli sahələri müəyyən edə bilər: eyni sorğunun çoxsaylı gətirilmələri (keşləmənin olmaması), cədvəl sürüşdürmə zamanı fault-obyektlərin sızması və ya əlaqəli varlıqların sinxron yüklənməsi səbəbindən əsas ipliyin bloklanması. Profilinqin real cihazda aparılması tövsiyə olunur, simulyatorda deyil, çünki simulyatorun performansı iPhone və ya iPad-də tətbiqin real davranışını əks etdirmir.
Tez-tez verilən suallar
Core Data — verilənlər bazası deyil, SQLite-dan anbar kimi istifadə edə bilən obyekt idarəetmə təbəqəsidir. Birbaşa SQLite-dan fərqli olaraq, Core Data obyekt dəyişikliklərini izləyir, geri qaytarmaları idarə edir və faulting və keşləmə ilə obyekt qrafiki təmin edir. SQLite sorğular üzərində daha çox nəzarət verir, lakin SQL yazmağı və tranzaksiyaları əl ilə idarə etməyi tələb edir.
Core Data dağıdıcı olmayan dəyişikliklər üçün yüngül miqrasiyanı (Lightweight Migration) dəstəkləyir: atribut əlavə etmə, ad dəyişdirmə, standart dəyər təyinetmə. Mürəkkəb dəyişikliklər üçün Mapping Model yaradılır. Yüngül miqrasiya NSPersistentStoreDescription-da shouldMigrateAutomatically bayrağı ilə aktivləşdirilir.
Bəli, Core Data SwiftUI ilə sorğular üçün @FetchRequest sarmaçısı və dəyişikliklərə abunə olmaq üçün @ObservedObject vasitəsilə inteqrasiya olunur. SwiftUI ManagedObject dəyişdikdə View-i avtomatik yeniləyir ki, bu da Core Data və SwiftUI-ni vəziyyətin idarə edilməsi üçün uyğun yığına çevirir.
Fault — Core Data qrafikində əlaqəli obyektin məlumatlarını ehtiva etməyən yüngül tutucudur. Fault təyin edildikdə (refreshObject: vasitəsilə) məlumatlar yaddaşdan boşaldılır. Xassəyə müraciət edildikdə fault avtomatik olaraq anbardan məlumatlarla doldurulur — bu, yaddaş istifadəsini optimallaşdıran gecikmiş yükləmə mexanizmidir.
Test üçün In-Memory anbar tipindən istifadə edin: NSPersistentStoreDescription NSInMemoryStoreType ilə. Konteyner test paketindən model ilə yaradılır. Hər testdən sonra bütün obyektləri silin və ya konteyneri yenidən yaradın — bu, test hallarının bir-birindən təcrid olunmasını təmin edir.
Xülasə
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