Core Data — шта је то, модел података и како функционише

Аутор: IT Sectr Објављено: 2026-05-04 Време читања: 8 мин

Core Data је Аpple-ов фрејмворк за управљање подацима који пружа објектно-релационо мапирање за iOS, macOS, tvOS и watchOS. Аутоматизује чување, проналажење и филтрирање објеката у апликацији, радећи на SQLite, XML или бинарном складишту. Према Apple Core Data Documentation, фрејмворк користи концепте Managed Object Context и NSPersistentContainer за управљање стеком перзистентности.

Главно

  • Core Data — Аpple-ов фрејмворк за објектно-релационо управљање подацима у апликацијама.
  • NSManagedObjectModel — опис шеме података: Entity, Attributes и Relationships.
  • NSManagedObject — објекат који одговара једном запису у Core Data складишту.
  • NSManagedObjectContext — радни простор за креирање, читање и чување објеката.
  • NSPersistentContainer — јединствени стек који обједињује модел, контекст и координатор складишта.

Шта је Core Data и његова улога у iOS

Core Data — је фрејмворк за управљање објектним графом и перзистентношћу, који је део Cocoa Touch-а. Супротно увреженом мишљењу, Core Data није база података, већ слој за управљање објектима који може да користи SQLite као једно од складишта. Главни задатак Core Data-е је да прати промене објеката, управља њиховим животним циклусом и синхронизује стање са диском.

Фрејмворк пружа граф објеката, где сваки Managed Object прати контекст ради промена. Приликом чувања контекста, сви измењени, додати и обрисани објекти се потврђују у трајном складишту једном трансакцијом. Ово ослобађа програмера од писања SQL упита и ручног управљања трансакцијама.

Према статистици Swift Developer Survey (2025), Core Data се користи у 52% iOS апликација које раде са локалним подацима. Упркос појави модерних алтернатива (SwiftData, Realm), Core Data остаје главни фрејмворк у постојећим Аpple пројектима захваљујући зрелости и дубокој интеграцији са системом.

Користите Core Data за пројекте са моделом података средње сложености, где су потребне релације између објеката, поништавање промена и аутоматско кеширање кроз faulting механизам.

Архитектура Core Data-е је изграђена око концепта Managed Object Context-а — радног простора који прати све промене објеката. Контекст подржава поништавање (undo/redo) кроз уграђени NSUndoManager, што омогућава имплементацију нацрта и отказивање радњи без ручног чувања снимака стања. Приликом позива save(), контекст потврђује све промене једном трансакцијом у трајном складишту, гарантујући атомичност и конзистентност података.

Модел података: Entity, Attributes, Relationships

Модел података Core Data се дефинише у датотеци .xcdatamodeld — визуелном едитору Xcode-а, где се описују све Entity, њихови атрибути и релације. Приликом компајлирања, модел се серијализује у .momd и учитава кроз NSManagedObjectModel.

Entity и Attributes

Entity — је опис типа података, аналогно табели у SQL-у. Свака Entity садржи скуп Attributes — именованих поља са типом података (String, Integer, Date, Boolean, Data). За разлику од Room-а, Core Data захтева експлицитан избор типа за сваки атрибут кроз едитор модела.

Relationships

Relationship — веза између Entity, аналогно страном кључу у SQL-у. Core Data подржава све типове веза: један-на-један, један-на-много и много-на-много. За сваку везу се подешава Delete Rule (Cascade, Nullify, Deny) — понашање приликом брисања повезаног објекта.

Delete RuleПонашање при брисањуПример примене
CascadeБрише све повезане објектеБрисање поруџбине заједно са ставкама
NullifyПоништава повратну везуБрисање аутора без брисања књига
DenyБлокира брисање ако постоје повезани објектиЗаштита од брисања категорије са производима

Избор Delete Rule је критичан за интегритет података: Cascade без провере може да обрише трећину базе, а Deny да блокира операцију са неразумљивом грешком. У продукцијском коду препоручује се Nullify са ручном обрадом осиротелих записа.

У едитору модела Xcode-а, програмер може да подеси не само Entity и атрибуте, већ и constraints (ограничења јединствености), индексе за убрзавање упита и default values за атрибуте. Све измене модела се компајлирају у датотеку .momd, која се учитава при иницијализацији NSPersistentContainer-а. Верзионисање модела (Model Versioning) омогућава одржавање више верзија шеме и извођење миграције између њих.

Стек Core Data: PersistentContainer и Context

NSPersistentContainer — јединствени објекат који управља стеком Core Data од iOS 10 и macOS 10.12. Инкапсулира NSManagedObjectModel, NSPersistentStoreCoordinator и NSManagedObjectContext, аутоматизујући учитавање модела и подешавање складишта. За старије верзије, стек се градио ручно, али сада то није препоручено.

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

viewContext — главни контекст повезан са главном нити. Сва читања и ажурирања UI-ја се обављају кроз њега. Уписивање података ради перформанси препоручује се да се обавља у позадинском контексту подређеног типа са накнадном синхронизацијом.

NSPersistentStoreCoordinator

Координатор NSPersistentStoreCoordinator повезује модел са физичким складиштем на диску. Core Data подржава неколико типова складишта: SQLite (препоручен), Binary и In-Memory. SQLite складиште подржава миграције, инкременталну резервну копију и отпорност на падове током процеса уписа.

NSFetchRequest и рад са подацима

NSFetchRequest — објекат који описује упит ка Core Data складишту. Садржи име Entity, предикат филтрирања, сортирање и подешавања преузимања. Упит се извршава кроз context.fetch(), који враћа низ NSManagedObject-а.

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] (неосетљив на велика и мала слова), SUBQUERY за угнежђене упите по повезаним Entity-има. Core Data такође подржава NSFetchedResultsController — класу за реактивно учитавање података у UITableView, која аутоматски прати промене и ажурира табелу са анимираним секцијама.

Core Data у вишевитном окружењу

Рад са Core Data у вишевитној апликацији захтева стриктно поштовање правила: NSManagedObject се не може директно преносити између нити. Свака нит (или ред) мора да користи сопствени контекст. Основни приступ — креирање подређеног NSManagedObjectContext-а са приватним редом (NSPrivateQueueConcurrencyType) за упис и viewContext за читање.

Подређени контекст се чува у родитељски, а затим родитељски — у складиште на диску. Ово гарантује да промене не блокирају главну нит и да UI увек види конзистентно стање кроз mergeChanges или аутоматско ажурирање viewContext-а приликом чувања.

Core Data користи faulting — механизам одложеног учитавања повезаних објеката. Приликом преузимања User-а без захтева за његове addresses, повезани Address се не учитавају док им се не приступи кроз тачкасту нотацију. Faulting штеди меморију и убрзава учитавање, али може изазвати неочекивана обраћања диску на главној нити ако се приступ не контролише у позадинским контекстима.

За ефикасно вишевитно окружење користите NSBatchInsertRequest и NSBatchDeleteRequest за масовно уметање и брисање без учитавања објеката у меморију — ово је критично за синхронизацију података са сервером.

Batch операције се извршавају директно на нивоу NSPersistentStoreCoordinator-а, заобилазећи контекст и граф објеката. Ово омогућава уметање 10.000 записа за неколико милисекунди без креирања 10.000 инстанци NSManagedObject-а у меморији. Након извршења batch упита, контекст се мора ажурирати кроз mergeChangesFromContextDidSaveNotification да би UI одразио нове податке. Аpple препоручује batch операције за почетно учитавање података и ноћну синхронизацију са сервером.

За праћење промена у Core Data користи се NSPersistentHistoryTracking — механизам који бележи сваку трансакцију (уметање, ажурирање, брисање) у засебној историји. Укључивање history tracking-а омогућава синхронизацију података између различитих процеса и апликација које раде са истим SQLite фајлом, на пример између главне апликације и Notification Service Extension-а. Активација се врши кроз NSPersistentStoreDescription са флагом persistentHistoryTrackingKey, а читање — кроз NSPersistentHistoryChangeRequest са филтером по датуму и типу трансакције.

За отклањање грешака и профилисање перформанси Core Data користи се алат Core Data Profiler из комплета Instruments у Xcode-у на macOS-у. Он приказује све операције преузимања, уметања, брисања и чувања са трајањем сваке операције и бројем учитаних објеката у табелама и на графицима временске линије. Програмер може да идентификује проблематична места: вишеструка преузимања истог упита (недостатак кеширања), цурење fault објеката приликом скроловања табеле или блокирање главне нити због синхроног учитавања повезаних ентитета. Препоручује се покретање профилисања на стварном уређају, а не на симулатору, јер перформансе симулатора не одражавају стварно понашање апликације на iPhone-у или iPad-у.

Често постављана питања

По чему се Core Data разликује од SQLite-а?

Core Data — није база података, већ слој за управљање објектима који може да користи SQLite као складиште. За разлику од директног SQLite-а, Core Data прати промене објеката, управља поништавањима и пружа граф објеката са faulting-ом и кеширањем. SQLite даје више контроле над упитима, али захтева писање SQL-а и ручно управљање трансакцијама.

Како извршити миграцију шеме Core Data-е?

Core Data подржава лаку миграцију (Lightweight Migration) за неразорне измене: додавање атрибута, преименовање, подешавање подразумеване вредности. За сложене измене креира се Mapping Model. Лака миграција се укључује флагом shouldMigrateAutomatically у NSPersistentStoreDescription-у.

Може ли се Core Data користити са SwiftUI-јем?

Да, Core Data се интегрише са SwiftUI-јем кроз омотач @FetchRequest за упите и @ObservedObject за претплату на промене. SwiftUI аутоматски ажурира View при промени ManagedObject-а, што чини Core Data и SwiftUI компатибилним стеком за управљање стањем.

Шта је fault у Core Data-и?

Fault — је лагани чувар у графу Core Data-е, који не садржи податке повезаног објекта. Приликом постављања fault-а (кроз refreshObject:) подаци се истоварују из меморије. Приликом приступа својству, fault се аутоматски попуњава подацима из складишта — ово је механизам одложеног учитавања који оптимизује коришћење меморије.

Како тестирати Core Data код?

За тестирање користите In-Memory тип складишта: NSPersistentStoreDescription са NSInMemoryStoreType. Контејнер се креира са моделом из тест пакета. Након сваког теста обришите све објекте или поново креирајте контејнер — ово гарантује изолацију тест случајева једног од другог.

Резиме

  • Core Data — фрејмворк за управљање објектним графом, који користи SQLite као подразумевано складиште.
  • NSManagedObjectModel описује шему: Entity, Attributes, Relationships и Delete Rules.
  • NSPersistentContainer обједињује модел, координатор и viewContext у јединствени стек.
  • NSFetchRequest са NSPredicate-ом и NSSortDescriptor-ом формира флексибилне упите ка складишту.
  • Вишевитност захтева одвојене контексте: подређени контекст за упис и viewContext за читање.
  • Faulting одлаже учитавање повезаних објеката до првог приступа, штедећи меморију.
  • Lightweight Migration аутоматски обрађује неразорне измене шеме без губитка података.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође