Core Data je framework pro správu dat od Apple, který poskytuje objektově-relační mapování pro iOS, macOS, tvOS a watchOS. Automatizuje ukládání, načítání a filtrování objektů v aplikaci, pracuje nad SQLite, XML nebo binárním úložištěm. Podle Apple Core Data Documentation framework využívá koncepty Managed Object Context a NSPersistentContainer pro správu zásobníku perzistence.
Hlavní body
Core Data — je framework pro správu objektového grafu a perzistence, který je součástí Cocoa Touch. Navzdory rozšířené mylné představě, Core Data není databáze, ale vrstva pro správu objektů, která může používat SQLite jako jedno z úložišť. Hlavním úkolem Core Data je sledovat změny objektů, spravovat jejich životní cyklus a synchronizovat stav s diskem.
Framework poskytuje objektový graf, kde každý Managed Object je sledován kontextem kvůli změnám. Při ukládání kontextu jsou všechny změněné, přidané a odstraněné objekty potvrzeny v trvalém úložišti jednou transakcí. To osvobozuje vývojáře od psaní SQL dotazů a ručního spravování transakcí.
Podle statistik Swift Developer Survey (2025) je Core Data používán v 52% iOS aplikací pracujících s lokálními daty. Navzdory vzniku moderních alternativ (SwiftData, Realm) zůstává Core Data hlavním frameworkem ve stávajících projektech Apple díky své zralosti a hluboké integraci se systémem.
Používejte Core Data pro projekty s modelem dat střední složitosti, kde jsou potřeba vztahy mezi objekty, vracení změn a automatické ukládání do mezipaměti prostřednictvím mechanismu faulting.
Architektura Core Data je postavena kolem konceptu Managed Object Context — pracovního prostoru, který sleduje všechny změny objektů. Kontext podporuje vracení (undo/redo) prostřednictvím vestavěného NSUndoManager, což umožňuje implementaci konceptů a rušení akcí bez ručního ukládání snímků stavu. Při volání save() kontext potvrzuje všechny změny jednou transakcí v trvalém úložišti, čímž zaručuje atomicitu a konzistenci dat.
Datový model Core Data je definován v souboru .xcdatamodeld — vizuálním editoru Xcode, kde jsou popsány všechny Entity, jejich atributy a vztahy. Při kompilaci je model serializován do .momd a načten pomocí NSManagedObjectModel.
Entity — je popis datového typu, analogický tabulce v SQL. Každá Entity obsahuje sadu Attributes — pojmenovaných polí s datovým typem (String, Integer, Date, Boolean, Data). Na rozdíl od Room vyžaduje Core Data explicitní výběr typu pro každý atribut prostřednictvím editoru modelu.
Relationship — vztah mezi Entitami, analogický cizímu klíči v SQL. Core Data podporuje všechny typy vztahů: jedna-k-jedné, jedna-k-mnoha a mnoho-k-mnoha. Pro každý vztah se nastavuje Delete Rule (Cascade, Nullify, Deny) — chování při odstraňování souvisejícího objektu.
| Delete Rule | Chování při odstranění | Příklad použití |
|---|---|---|
| Cascade | Odstraňuje všechny související objekty | Odstranění objednávky spolu s položkami |
| Nullify | Vynuluje zpětný vztah | Odstranění autora bez odstranění knih |
| Deny | Blokuje odstranění, pokud existují související objekty | Ochrana před odstraněním kategorie s produkty |
Výběr Delete Rule je kritický pro integritu dat: Cascade bez kontroly může odstranit třetinu databáze a Deny může zablokovat operaci s nesrozumitelnou chybou. V produkčním kódu se doporučuje Nullify s ručním zpracováním osiřelých záznamů.
V editoru modelu Xcode může vývojář nastavit nejen Entity a atributy, ale také constraints (omezení jedinečnosti), indexy pro urychlení dotazů a default values pro atributy. Všechny změny modelu jsou zkompilovány do souboru .momd, který je načten při inicializaci NSPersistentContainer. Verzování modelu (Model Versioning) umožňuje udržovat více verzí schématu a provádět migraci mezi nimi.
NSPersistentContainer — jednotný objekt, který spravuje zásobník Core Data od iOS 10 a macOS 10.12. Zapouzdřuje NSManagedObjectModel, NSPersistentStoreCoordinator a NSManagedObjectContext, čímž automatizuje načítání modelu a konfiguraci úložiště. Pro starší verze se zásobník vytvářel ručně, ale nyní se to nedoporučuje.
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores { _, error in
if let error { fatalError("Core Data load failed: \(error)") }
}
let context = container.viewContext
viewContext — hlavní kontext připojený k hlavnímu vláknu. Všechna čtení a aktualizace UI se provádějí přes něj. Zápis dat pro výkon se doporučuje provádět v podřízeném kontextu s privátní frontou a následnou synchronizací.
Koordinátor NSPersistentStoreCoordinator propojuje model s fyzickým úložištěm na disku. Core Data podporuje několik typů úložišť: SQLite (doporučené), Binary a In-Memory. Úložiště SQLite podporuje migrace, inkrementální zálohování a odolnost proti selhání během procesu zápisu.
NSFetchRequest — objekt, který popisuje dotaz do úložiště Core Data. Obsahuje název Entity, predikát filtrování, řazení a nastavení načítání. Dotaz se provádí pomocí context.fetch(), který vrací pole NSManagedObject.
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 podporuje složité podmínky: LIKE, IN, BETWEEN, CONTAINS[c] (nezávislé na velikosti písmen), SUBQUERY pro vnořené dotazy na související Entity. Core Data také podporuje NSFetchedResultsController — třídu pro reaktivní načítání dat do UITableView, která automaticky sleduje změny a aktualizuje tabulku s animovanými sekcemi.
Práce s Core Data ve vícevláknové aplikaci vyžaduje přísné dodržování pravidel: NSManagedObject nelze přímo předávat mezi vlákny. Každé vlákno (nebo fronta) musí používat svůj vlastní kontext. Hlavním přístupem je vytvoření podřízeného NSManagedObjectContext s privátní frontou (NSPrivateQueueConcurrencyType) pro zápis a viewContext pro čtení.
Podřízený kontext se ukládá do nadřízeného a poté nadřízený — do úložiště na disku. To zaručuje, že změny neblokují hlavní vlákno a že UI vždy vidí konzistentní stav prostřednictvím mergeChanges nebo automatické aktualizace viewContext při ukládání.
Core Data používá faulting — mechanismus opožděného načítání souvisejících objektů. Při načítání User bez vyžádání jeho addresses se související Address nenačítají, dokud k nim není přistoupeno pomocí tečkové notace. Faulting šetří paměť a urychluje načítání, ale může způsobit neočekávané přístupy k disku na hlavním vlákně, pokud není přístup kontrolován v kontextech na pozadí.
Pro efektivní vícevláknovou práci používejte NSBatchInsertRequest a NSBatchDeleteRequest pro hromadné vkládání a odstraňování bez načítání objektů do paměti — to je kritické pro synchronizaci dat se serverem.
Dávkové operace se provádějí přímo na úrovni NSPersistentStoreCoordinator a obcházejí kontext a objektový graf. To umožňuje vložit 10 000 záznamů během několika milisekund bez vytvoření 10 000 instancí NSManagedObject v paměti. Po provedení dávkového dotazu je třeba kontext aktualizovat pomocí mergeChangesFromContextDidSaveNotification, aby UI odráželo nová data. Apple doporučuje dávkové operace pro počáteční načítání dat a noční synchronizaci se serverem.
Pro sledování změn v Core Data se používá NSPersistentHistoryTracking — mechanismus, který zaznamenává každou transakci (vložení, aktualizaci, odstranění) v samostatné historii. Aktivace history tracking umožňuje synchronizovat data mezi různými procesy a aplikacemi pracujícími se stejným SQLite souborem, například mezi hlavní aplikací a Notification Service Extension. Aktivace se provádí pomocí NSPersistentStoreDescription s příznakem persistentHistoryTrackingKey a čtení pomocí NSPersistentHistoryChangeRequest s filtrem podle data a typu transakce.
Pro ladění a profilování výkonu Core Data se používá nástroj Core Data Profiler ze sady Instruments v Xcode na macOS. Zobrazuje všechny operace načítání, vkládání, odstraňování a ukládání s dobou trvání každé operace a počtem načtených objektů v tabulkách a grafech časové osy. Vývojář může identifikovat problémová místa: vícenásobná načítání stejného dotazu (nedostatek cache), úniky fault objektů při rolování tabulky nebo blokování hlavního vlákna kvůli synchronnímu načítání souvisejících entit. Profilování se doporučuje provádět na skutečném zařízení, ne na simulátoru, protože výkon simulátoru neodráží skutečné chování aplikace na iPhone nebo iPad.
Často kladené otázky
Core Data — není databáze, ale vrstva pro správu objektů, která může používat SQLite jako úložiště. Na rozdíl od přímého SQLite, Core Data sleduje změny objektů, spravuje vracení změn a poskytuje objektový graf s faulting a cache. SQLite dává větší kontrolu nad dotazy, ale vyžaduje psaní SQL a ruční správu transakcí.
Core Data podporuje lehkou migraci (Lightweight Migration) pro neničící změny: přidání atributu, přejmenování, nastavení výchozí hodnoty. Pro složité změny se vytváří Mapping Model. Lehká migrace se zapíná příznakem shouldMigrateAutomatically v NSPersistentStoreDescription.
Ano, Core Data se integruje se SwiftUI prostřednictvím obálky @FetchRequest pro dotazy a @ObservedObject pro odběr změn. SwiftUI automaticky aktualizuje View při změně ManagedObject, což činí Core Data a SwiftUI kompatibilním zásobníkem pro správu stavu.
Fault — je lehká zástupka v grafu Core Data, která neobsahuje data souvisejícího objektu. Při nastavení fault (pomocí refreshObject:) se data uvolní z paměti. Při přístupu k vlastnosti se fault automaticky naplní daty z úložiště — to je mechanismus opožděného načítání, který optimalizuje využití paměti.
Pro testování použijte typ úložiště In-Memory: NSPersistentStoreDescription s NSInMemoryStoreType. Kontejner se vytvoří s modelem z testovacího balíčku. Po každém testu odstraňte všechny objekty nebo znovu vytvořte kontejner — to zaručuje izolaci testovacích případů od sebe navzájem.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také