Core Data — nedir, veri modeli ve nasıl çalışır

Yazar: IT Sectr Yayınlanma: 2026-05-04 Okuma süresi: 8 dk

Core Data, iOS, macOS, tvOS ve watchOS için nesne-ilişkisel haritalama sağlayan bir Apple veri yönetimi framework'üdür. SQLite, XML veya ikili depolama üzerinde çalışarak uygulamadaki nesnelerin kaydedilmesini, alınmasını ve filtrelenmesini otomatikleştirir. Apple Core Data Documentation'a göre, framework, kalıcılık yığınını yönetmek için Managed Object Context ve NSPersistentContainer kavramlarını kullanır.

Ana Noktalar

  • Core Data — uygulamalarda nesne-ilişkisel veri yönetimi için Apple framework'ü.
  • NSManagedObjectModel — veri şeması tanımı: Entity, Attributes ve Relationships.
  • NSManagedObject — Core Data deposundaki bir kayda karşılık gelen nesne.
  • NSManagedObjectContext — nesneleri oluşturmak, okumak ve kaydetmek için çalışma alanı.
  • NSPersistentContainer — modeli, bağlamı ve depo koordinatörünü birleştiren birleşik yığın.

Core Data Nedir ve iOS'taki Rolü

Core Data, Cocoa Touch'un bir parçası olan bir nesne grafiği ve kalıcılık yönetimi framework'üdür. Yaygın yanılgının aksine, Core Data bir veritabanı değil, SQLite'ı depolarından biri olarak kullanabilen bir nesne yönetim katmanıdır. Core Data'nın ana görevi, nesne değişikliklerini izlemek, yaşam döngülerini yönetmek ve durumu diskle senkronize etmektir.

Framework, her Managed Object'in değişiklikler için bağlam tarafından izlendiği bir nesne grafiği sağlar. Kaydetme sırasında, değiştirilen, eklenen ve silinen tüm nesneler tek bir işlemde kalıcı depoya aktarılır. Bu, geliştiricinin SQL sorguları yazma ve işlemleri manuel olarak yönetme ihtiyacını ortadan kaldırır.

Swift Developer Survey (2025) istatistiklerine göre, Core Data yerel verilerle çalışan iOS uygulamalarının %52'sinde kullanılmaktadır. Modern alternatiflerin (SwiftData, Realm) ortaya çıkmasına rağmen, Core Data olgunluğu ve derin sistem entegrasyonu sayesinde mevcut Apple projelerinde birincil framework olmaya devam etmektedir.

Core Data'yı, nesne ilişkileri, değişiklik geri alma ve faulting mekanizması aracılığıyla otomatik önbellekleme gerektiren orta karmaşıklıkta veri modeline sahip projeler için kullanın.

Core Data mimarisi, Managed Object Context kavramı etrafında inşa edilmiştir — tüm nesne değişikliklerini izleyen bir çalışma alanı. Bağlam, yerleşik NSUndoManager aracılığıyla geri al/yinele desteği sağlayarak, durum anlık görüntülerini manuel olarak kaydetmeden taslaklar ve eylem iptali uygulamaya olanak tanır. save() çağrıldığında, bağlam tüm değişiklikleri tek bir işlemde kalıcı depoya aktararak veri atomikliğini ve tutarlılığını garanti eder.

Veri Modeli: Entity, Attributes, Relationships

Core Data veri modeli, .xcdatamodeld dosyasında tanımlanır — Xcode'un tüm Entity'lerin, özniteliklerinin ve ilişkilerinin tanımlandığı görsel düzenleyicisi. Derleme sırasında model .momd'ye serileştirilir ve NSManagedObjectModel aracılığıyla yüklenir.

Entity ve Attributes

Entity, SQL'deki bir tabloya benzer şekilde bir veri türü tanımıdır. Her Entity, bir dizi Attributes (String, Integer, Date, Boolean, Data veri türünde adlandırılmış alanlar) içerir. Room'dan farklı olarak, Core Data, model düzenleyicisi aracılığıyla her öznitelik için açık tür seçimi gerektirir.

Relationships

Relationship, SQL'deki yabancı anahtara benzer şekilde Entity'ler arasındaki bir bağlantıdır. Core Data tüm ilişki türlerini destekler: bire-bir, bire-çok ve çoka-çok. Her ilişki için bir Delete Rule (Cascade, Nullify, Deny) yapılandırılır — ilgili nesne silindiğinde davranış.

Delete RuleSilme Sırasında DavranışKullanım Örneği
CascadeTüm ilgili nesneleri silerSiparişi öğeleriyle birlikte silme
NullifyTers ilişkiyi null yaparKitapları silmeden yazarı silme
Denyİlgili nesneler varsa silmeyi engellerÜrünleri olan bir kategoriyi silmeyi önleme

Bir Delete Rule seçmek veri bütünlüğü için kritiktir: Cascade doğrulama olmadan veritabanının üçte birini silebilirken, Deny belirsiz bir hatayla işlemi engelleyebilir. Üretim kodunda, manuel yetim kayıt işleme ile Nullify önerilir.

Xcode model düzenleyicisinde, geliştirici yalnızca Entity ve öznitelikleri değil, aynı zamanda constraints (benzersiz kısıtlamalar), sorgu hızlandırma için indeksler ve öznitelikler için varsayılan değerler de tanımlayabilir. Tüm model değişiklikleri, NSPersistentContainer başlatma sırasında yüklenen bir .momd dosyasına derlenir. Model Sürümleme (Model Versioning), birden çok şema sürümünü korumayı ve aralarında geçiş yapmayı sağlar.

Core Data Yığını: PersistentContainer ve Context

NSPersistentContainer, iOS 10 ve macOS 10.12'den bu yana Core Data yığınını yöneten tek bir nesnedir. NSManagedObjectModel, NSPersistentStoreCoordinator ve NSManagedObjectContext'i kapsüller, model yüklemeyi ve depo yapılandırmasını otomatikleştirir. Eski sürümler için yığın manuel olarak oluşturuluyordu, ancak bu artık önerilmemektedir.

swift
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores { _, error in
    if let error { fatalError("Core Data load failed: \(error)") }
}
let context = container.viewContext

viewContext, ana iş parçacığına bağlı ana bağlamdır. Tüm okuma ve UI güncellemeleri onun aracılığıyla yapılır. Performans için, veri yazmanın daha sonra senkronizasyonla birlikte bir arka plan alt bağlamında yapılması önerilir.

NSPersistentStoreCoordinator

NSPersistentStoreCoordinator koordinatörü, modeli diskteki fiziksel depolamaya bağlar. Core Data birden çok depo türünü destekler: SQLite (önerilen), Binary ve In-Memory. SQLite deposu geçişleri, artımlı yedeklemeyi ve yazma işlemleri sırasında çökme direncini destekler.

NSFetchRequest ve Verilerle Çalışma

NSFetchRequest, Core Data deposuna bir sorguyu tanımlayan nesnedir. Entity adını, filtre predikatını, sıralama tanımlayıcılarını ve getirme ayarlarını içerir. Sorgu, bir NSManagedObject dizisi döndüren context.fetch() aracılığıyla yürütülür.

swift
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, LIKE, IN, BETWEEN, CONTAINS[c] (büyük/küçük harf duyarsız), ilgili Entity'lerde iç içe sorgular için SUBQUERY gibi karmaşık koşulları destekler. Core Data ayrıca NSFetchedResultsController'ı da destekler — UITableView'da reaktif veri yüklemesi için bir sınıf, değişiklikleri otomatik olarak izler ve tabloyu animasyonlu bölümlerle günceller.

Çok İş Parçacıklı Ortamda Core Data

Çok iş parçacıklı bir uygulamada Core Data ile çalışmak, katı kurallara uyulmasını gerektirir: NSManagedObject doğrudan iş parçacıkları arasında aktarılamaz. Her iş parçacığı (veya kuyruk) kendi bağlamını kullanmalıdır. Ana yaklaşım, yazma için özel bir kuyruğa (NSPrivateQueueConcurrencyType) sahip bir alt NSManagedObjectContext ve okuma için viewContext oluşturmaktır.

Alt bağlam üst bağlama kaydeder, ardından üst bağlam disk deposuna kaydeder. Bu, değişikliklerin ana iş parçacığını bloke etmemesini ve UI'nın her zaman mergeChanges veya kaydetme sırasında otomatik viewContext güncellemesi aracılığıyla tutarlı bir durum görmesini garanti eder.

Core Data, faulting kullanır — ilgili nesneler için bir gecikmeli yükleme mekanizması. Adreslerini istemeden bir User getirildiğinde, ilgili Address nesneleri nokta notasyonuyla erişilene kadar yüklenmez. Faulting bellekten tasarruf sağlar ve yüklemeyi hızlandırır, ancak arka plan bağlamlarında erişim kontrol edilmezse ana iş parçacığında beklenmeyik disk erişimlerine neden olabilir.

Verimli çoklu iş parçacığı için, belleğe nesne yüklemeden toplu ekleme ve silme işlemleri için NSBatchInsertRequest ve NSBatchDeleteRequest kullanın — bu, sunucuyla veri senkronizasyonu için kritiktir.

Toplu işlemler, bağlamı ve nesne grafiğini atlayarak doğrudan NSPersistentStoreCoordinator düzeyinde yürütülür. Bu, bellekte 10.000 NSManagedObject örneği oluşturmadan milisaniyeler içinde 10.000 kayıt eklemeye olanak tanır. Toplu istek yürütüldükten sonra, UI'nın yeni verileri yansıtması için bağlamın mergeChangesFromContextDidSaveNotification aracılığıyla güncellenmesi gerekir. Apple, ilk veri yükleme ve gece sunucu senkronizasyonu için toplu işlemleri önerir.

Core Data'da değişiklik izleme için NSPersistentHistoryTracking kullanılır — her işlemi (ekleme, güncelleme, silme) ayrı bir geçmişe kaydeden bir mekanizma. Geçmiş izlemeyi etkinleştirmek, aynı SQLite dosyasıyla çalışan farklı süreçler ve uygulamalar (örneğin ana uygulama ile Notification Service Extension) arasında veri senkronizasyonuna olanak tanır. Etkinleştirme, persistentHistoryTrackingKey bayrağıyla NSPersistentStoreDescription aracılığıyla yapılır ve okuma, tarih ve işlem türüne göre filtreleme yapan NSPersistentHistoryChangeRequest aracılığıyla yapılır.

Core Data hata ayıklama ve performans profili oluşturma için, macOS'ta Xcode'daki Instruments paketinden Core Data Profiler aracı kullanılır. Her işlemin süresi ve tablolarda ve zaman çizelgesi grafiklerinde yüklenen nesne sayısıyla birlikte tüm getirme, ekleme, silme ve kaydetme işlemlerini gösterir. Geliştirici sorunlu alanları belirleyebilir: aynı sorgunun birden çok kez getirilmesi (önbellekleme eksikliği), tablo kaydırma sırasında fault nesne sızıntıları veya ilgili varlıkların eşzamanlı yüklenmesi nedeniyle ana iş parçacığının bloke olması. Simülatörün performansı, uygulamanın bir iPhone veya iPad'deki gerçek davranışını yansıtmadığından, profili gerçek bir cihazda çalıştırmanız önerilir.

Sıkça Sorulan Sorular

Core Data, SQLite'dan nasıl farklıdır?

Core Data bir veritabanı değil, SQLite'ı depo olarak kullanabilen bir nesne yönetim katmanıdır. Doğrudan SQLite'ın aksine, Core Data nesne değişikliklerini izler, geri almayı yönetir ve faulting ve önbellekleme ile bir nesne grafiği sağlar. SQLite sorgular üzerinde daha fazla kontrol sağlar, ancak SQL yazmayı ve işlemleri manuel olarak yönetmeyi gerektirir.

Core Data şema geçişi nasıl yapılır?

Core Data, yıkıcı olmayan değişiklikler için Hafif Geçişi (Lightweight Migration) destekler: öznitelik ekleme, yeniden adlandırma, varsayılan değer ayarlama. Karmaşık değişiklikler için bir Mapping Model oluşturulur. Hafif geçiş, NSPersistentStoreDescription içindeki shouldMigrateAutomatically bayrağıyla etkinleştirilir.

Core Data, SwiftUI ile kullanılabilir mi?

Evet, Core Data, sorgular için @FetchRequest sarmalayıcısı ve değişiklik aboneliği için @ObservedObject aracılığıyla SwiftUI ile entegre olur. Bir ManagedObject değiştiğinde SwiftUI, View'i otomatik olarak günceller ve bu da Core Data ve SwiftUI'yi durum yönetimi için uyumlu bir yığın haline getirir.

Core Data'da fault nedir?

Fault, ilgili nesnenin verilerini içermeyen Core Data grafiğindeki hafif bir yer tutucudur. Bir fault ayarlandığında (refreshObject: aracılığıyla), veriler bellekten boşaltılır. Bir özelliğe erişildiğinde, fault otomatik olarak depodaki verilerle doldurulur — bu, bellek kullanımını optimize eden bir gecikmeli yükleme mekanizmasıdır.

Core Data kodu nasıl test edilir?

Test için, In-Memory depo türünü kullanın: NSInMemoryStoreType ile NSPersistentStoreDescription. Kapsayıcı, test paketindeki modelle oluşturulur. Her testten sonra tüm nesneleri silin veya kapsayıcıyı yeniden oluşturun — bu, test senaryolarının birbirinden yalıtılmasını garanti eder.

Özet

  • Core Data, SQLite'ı varsayılan depo olarak kullanan bir nesne grafiği yönetimi framework'üdür.
  • NSManagedObjectModel şemayı tanımlar: Entity, Attributes, Relationships ve Delete Rules.
  • NSPersistentContainer modeli, koordinatörü ve viewContext'i birleşik bir yığında birleştirir.
  • NSFetchRequest, NSPredicate ve NSSortDescriptor ile depoya esnek sorgular oluşturur.
  • Çoklu iş parçacığı, ayrı bağlamlar gerektirir: yazma için bir alt bağlam ve okuma için viewContext.
  • Faulting, ilk erişime kadar ilgili nesnelerin yüklenmesini geciktirerek bellekten tasarruf sağlar.
  • Lightweight Migration, veri kaybı olmadan yıkıcı olmayan şema değişikliklerini otomatik olarak işler.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun