A Core Data egy adatkezelési keretrendszer az Apple-től, amely objektum-relációs leképezést biztosít iOS, macOS, tvOS és watchOS rendszerekhez. Automatizálja az objektumok mentését, lekérését és szűrését az alkalmazásban, SQLite, XML vagy bináris tároló felett működve. A Apple Core Data Documentation szerint a keretrendszer a Managed Object Context és NSPersistentContainer fogalmakat használja a perzisztencia verem kezelésére.
Főbb pontok
A Core Data — egy objektumgráf- és perzisztenciakezelési keretrendszer, amely a Cocoa Touch része. A közhiedelemmel ellentétben a Core Data nem adatbázis, hanem egy objektumkezelő réteg, amely az SQLite-ot használhatja az egyik tárolóként. A Core Data fő feladata az objektumok változásainak nyomon követése, életciklusuk kezelése és az állapot szinkronizálása a lemezzel.
A keretrendszer egy objektumgráfot biztosít, ahol minden Managed Object-et a kontextus figyel a változásokra. A kontextus mentésekor az összes módosított, hozzáadott és törölt objektum egy tranzakcióban kerül jóváhagyásra az állandó tárolóban. Ez megszabadítja a fejlesztőt az SQL lekérdezések írásától és a tranzakciók manuális kezelésétől.
A Swift Developer Survey (2025) statisztikái szerint a Core Data a helyi adatokkal dolgozó iOS-alkalmazások 52%-ában használatos. A modern alternatívák (SwiftData, Realm) megjelenése ellenére a Core Data továbbra is a fő keretrendszer a meglévő Apple-projektekben érettségének és a rendszerrel való mély integrációjának köszönhetően.
Használja a Core Data-t közepes összetettségű adatmodellű projektekhez, ahol objektumok közötti kapcsolatokra, változtatások visszavonására és automatikus gyorsítótárazásra van szükség a faulting mechanizmuson keresztül.
A Core Data architektúrája a Managed Object Context fogalma köré épül — egy munkaterület, amely az objektumok összes változását nyomon követi. A kontextus támogatja a visszavonást (undo/redo) a beépített NSUndoManager segítségével, ami lehetővé teszi piszkozatok és műveletek visszavonásának megvalósítását az állapotpillanatképek manuális mentése nélkül. A save() meghívásakor a kontextus egy tranzakcióban jóváhagyja az összes változást az állandó tárolóban, garantálva az atomosságot és az adatok konzisztenciáját.
A Core Data adatmodell a .xcdatamodeld fájlban — az Xcode vizuális szerkesztőjében van meghatározva, ahol az összes Entitás, attribútum és kapcsolat leírásra kerül. Fordításkor a modell .momd formátumba szerializálódik és az NSManagedObjectModel segítségével töltődik be.
Entity — egy adattípus leírása, analóg egy SQL táblával. Minden Entity tartalmaz egy Attributes készletet — elnevezett mezőket adattípussal (String, Integer, Date, Boolean, Data). A Room-tól eltérően a Core Data minden attribútumhoz explicit típusválasztást igényel a modellszerkesztőn keresztül.
Relationship — kapcsolat Entity-k között, analóg egy idegen kulccsal SQL-ben. A Core Data támogatja az összes kapcsolattípust: egy-az-egyhez, egy-a-többhöz és több-a-többhöz. Minden kapcsolathoz beállítható egy Delete Rule (Cascade, Nullify, Deny) — a viselkedés a kapcsolódó objektum törlésekor.
| Delete Rule | Viselkedés törléskor | Alkalmazási példa |
|---|---|---|
| Cascade | Törli az összes kapcsolódó objektumot | Rendelés törlése a tételekkel együtt |
| Nullify | Nullázza a visszirányú kapcsolatot | Szerző törlése a könyvek törlése nélkül |
| Deny | Blokkolja a törlést, ha vannak kapcsolódó objektumok | Védelem a kategória törlése ellen termékekkel |
A Delete Rule kiválasztása kritikus az adatintegritás szempontjából: a Cascade ellenőrzés nélkül törölheti az adatbázis egyharmadát, a Deny pedig egy érthetetlen hibával blokkolhatja a műveletet. Éles kódban a Nullify ajánlott az árva rekordok manuális feldolgozásával.
Az Xcode modellszerkesztőjében a fejlesztő nem csak Entity-ket és attribútumokat állíthat be, hanem constraints (egyediségi korlátozások), indexeket a lekérdezések gyorsításához és default values értékeket az attribútumokhoz. A modell összes változása a .momd fájlba fordul, amely az NSPersistentContainer inicializálásakor töltődik be. A modell verziókezelése (Model Versioning) lehetővé teszi a séma több verziójának fenntartását és a migráció végrehajtását közöttük.
NSPersistentContainer — egy egységes objektum, amely az iOS 10 és macOS 10.12 óta kezeli a Core Data vermet. Encapsulálja az NSManagedObjectModel-t, NSPersistentStoreCoordinator-t és NSManagedObjectContext-et, automatizálva a modell betöltését és a tároló konfigurálását. Régebbi verziókhoz a verem manuálisan épült, de ez ma már nem ajánlott.
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores { _, error in
if let error { fatalError("Core Data load failed: \(error)") }
}
let context = container.viewContext
viewContext — a fő szálhoz kötött fő kontextus. Minden olvasás és UI-frissítés ezen keresztül történik. Az adatok írása a teljesítmény érdekében egy gyermek kontextusban, privát sorral és későbbi szinkronizálással ajánlott.
A NSPersistentStoreCoordinator koordinátor összeköti a modellt a fizikai tárolóval a lemezen. A Core Data több tárolótípust támogat: SQLite (ajánlott), Binary és In-Memory. Az SQLite tároló támogatja a migrációkat, növekményes biztonsági mentést és az írási folyamat során fellépő hibákkal szembeni ellenállást.
NSFetchRequest — egy objektum, amely lekérdezést ír le a Core Data tárolóhoz. Tartalmazza az Entity nevét, szűrési predikátumot, rendezést és lekérési beállításokat. A lekérdezés a context.fetch()-en keresztül hajtódik végre, amely NSManagedObject tömböt ad vissza.
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)
Az NSPredicate támogatja az összetett feltételeket: LIKE, IN, BETWEEN, CONTAINS[c] (kis- és nagybetű érzéketlen), SUBQUERY a beágyazott lekérdezésekhez kapcsolódó Entity-kre. A Core Data támogatja a NSFetchedResultsController osztályt is — reaktív adatbetöltéshez UITableView-be, amely automatikusan követi a változásokat és animált szekciókkal frissíti a táblázatot.
A Core Data-val való munka többszálú alkalmazásban szigorú szabályok betartását igényli: az NSManagedObject nem adható át közvetlenül a szálak között. Minden szálnak (vagy sornak) saját kontextust kell használnia. A fő megközelítés — egy gyermek NSManagedObjectContext létrehozása privát sorral (NSPrivateQueueConcurrencyType) íráshoz és viewContext olvasáshoz.
A gyermek kontextus a szülőbe mentődik, majd a szülő — a lemezen lévő tárolóba. Ez garantálja, hogy a változtatások nem blokkolják a fő szálat, és a UI mindig konzisztens állapotot lát a mergeChanges vagy a viewContext automatikus frissítése révén mentéskor.
A Core Data faulting-ot használ — a kapcsolódó objektumok késleltetett betöltésének mechanizmusát. Az User lekérésekor annak addresses kérése nélkül a kapcsolódó Address-ek nem töltődnek be, amíg pontjelöléssel nem hivatkoznak rájuk. A faulting memóriát takarít meg és gyorsítja a betöltést, de váratlan lemezhozzáféréseket okozhat a fő szálon, ha a hozzáférés nincs szabályozva a háttérkontextusokban.
A hatékony többszálúsághoz használja az NSBatchInsertRequest és NSBatchDeleteRequest osztályokat tömeges beszúráshoz és törléshez anélkül, hogy objektumokat töltene a memóriába — ez kritikus a szerverrel való adatszinkronizáláshoz.
A batch műveletek közvetlenül az NSPersistentStoreCoordinator szintjén hajtódnak végre, megkerülve a kontextust és az objektumgráfot. Ez lehetővé teszi 10.000 rekord beszúrását néhány ezredmásodperc alatt anélkül, hogy 10.000 NSManagedObject példányt hozna létre a memóriában. A batch lekérdezés végrehajtása után a kontextust frissíteni kell a mergeChangesFromContextDidSaveNotification segítségével, hogy a UI tükrözze az új adatokat. Az Apple a batch műveleteket ajánlja az adatok kezdeti betöltéséhez és az éjszakai szerver-szinkronizáláshoz.
A Core Data változásainak nyomon követéséhez az NSPersistentHistoryTracking mechanizmus használható, amely minden tranzakciót (beszúrás, frissítés, törlés) egy külön történetben rögzít. A history tracking engedélyezése lehetővé teszi az adatok szinkronizálását különböző folyamatok és alkalmazások között, amelyek ugyanazzal az SQLite-fájllal dolgoznak, például a fő alkalmazás és a Notification Service Extension között. Az aktiválás az NSPersistentStoreDescription-en keresztül történik a persistentHistoryTrackingKey jelzővel, az olvasás pedig az NSPersistentHistoryChangeRequest-en keresztül, dátum és tranzakció típusa szerinti szűréssel.
A Core Data teljesítményének hibakereséséhez és profilozásához a Core Data Profiler eszköz használható az Xcode Instruments készletéből macOS-en. Ez megjeleníti az összes lekérési, beszúrási, törlési és mentési műveletet az egyes műveletek időtartamával és a betöltött objektumok számával táblázatokban és idővonal grafikonokon. A fejlesztő azonosíthatja a problémás területeket: ugyanazon lekérdezés többszöri végrehajtása (gyorsítótárazás hiánya), fault-objektumok szivárgása a táblázat görgetésekor vagy a fő szál blokkolása a kapcsolódó entitások szinkron betöltése miatt. A profilozást valós eszközön ajánlott futtatni, nem szimulátoron, mert a szimulátor teljesítménye nem tükrözi az alkalmazás valós viselkedését iPhone-on vagy iPad-en.
Gyakran Ismételt Kérdések
A Core Data — nem adatbázis, hanem egy objektumkezelő réteg, amely az SQLite-ot használhatja tárolóként. A közvetlen SQLite-tól eltérően a Core Data nyomon követi az objektumok változásait, kezeli a visszavonásokat és objektumgráfot biztosít faulting-gal és gyorsítótárazással. Az SQLite nagyobb ellenőrzést ad a lekérdezések felett, de SQL írását és a tranzakciók manuális kezelését igényli.
A Core Data támogatja a könnyű migrációt (Lightweight Migration) a nem romboló változtatásokhoz: attribútum hozzáadása, átnevezés, alapértelmezett érték beállítása. Összetett változtatásokhoz Mapping Model készül. A könnyű migráció a shouldMigrateAutomatically jelzővel aktiválható az NSPersistentStoreDescription-ben.
Igen, a Core Data integrálódik a SwiftUI-val a @FetchRequest burkolón keresztül lekérdezésekhez és a @ObservedObject segítségével a változások feliratkozásához. A SwiftUI automatikusan frissíti a View-t a ManagedObject változásakor, ami a Core Data-t és a SwiftUI-t kompatibilis veremmé teszi az állapotkezeléshez.
A Fault — egy könnyű helyőrző a Core Data gráfban, amely nem tartalmazza a kapcsolódó objektum adatait. A fault beállításakor (a refreshObject: segítségével) az adatok kiürülnek a memóriából. A tulajdonság elérésekor a fault automatikusan feltöltődik a tároló adataival — ez egy késleltetett betöltési mechanizmus, amely optimalizálja a memóriahasználatot.
Teszteléshez használja az In-Memory tárolótípust: NSPersistentStoreDescription NSInMemoryStoreType-tal. A konténer a teszt bundle modelljével jön létre. Minden teszt után törölje az összes objektumot vagy hozza létre újra a konténert — ez garantálja a tesztesetek egymástól való elkülönítését.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is