Core Data
Core Data – framework opracowany przez firmę Apple udostępniany w systemach operacyjnych iOS, iPadOS, macOS, watchOS i tvOS. Służy do zarządzania modelami obiektowymi oraz ich trwałej persystencji w aplikacjach. Choć nie jest jedynie bazą danych, umożliwia ona przechowywanie, pobieranie i przetwarzanie danych w sposób zbliżony do systemów ORM (Object‑Relational Mapping).
Historia
Framework został po raz pierwszy wprowadzony w 2008 roku jako część Mac OS X Tiger i od tego czasu był stopniowo rozbudowywany. W wersji iOS 3 pojawił się wsparcie dla urządzeń mobilnych, a w kolejnych aktualizacjach wprowadzono m.in. integrację z językiem Swift oraz obsługę iCloud.
Podstawowe pojęcia
- Model danych – opisany w Core Data Model za pomocą diagramu encji i ich atrybutów.
- Managed Object Context (MOC) – obiekt
NSManagedObjectContextpośredniczący w operacjach na danych, zapewniający izolację transakcji. - Managed Object – instancja klasy
NSManagedObjectreprezentująca pojedynczy rekord w modelu. - Persistent Store – fizyczny magazyn danych; najczęściej używany jest SQLite, ale dostępne są także formaty binary oraz XML.
- Persistent Store Coordinator (PSC) – komponent koordynujący dostęp do jednego lub wielu persistent store równocześnie.
- Fetch Request – zapytanie (klasa
NSFetchRequest) umożliwiające pobieranie obiektów spełniających określone kryteria.
Architektura
Architektura Core Data opiera się na warstwach:
- Warstwa Model – opisuje strukturę danych w pliku
.xcdatamodeld. - Warstwa Managed Object Context – buforuje zmiany i zapewnia mechanizm cofania oraz operacji wsadowych.
- Warstwa Persistent Store Coordinator – tłumaczy operacje kontekstu na konkretne operacje w magazynie (np. SQL).
- Warstwa Persistent Store – fizyczny format przechowywania danych (SQLite, binary, XML, CloudKit).
Główne zalety
- Abstrakcja warstwy bazodanowej – programista pracuje z obiektami, nie z zapytaniami SQL.
- Obsługa grafu obiektów – automatyczne śledzenie relacji między encjami.
- Wbudowane mechanizmy optymalizacji – m.in. faulting i batch fetching.
- Zgodność z MVC – model jest wyraźnie oddzielony od warstwy prezentacji.
- Wsparcie dla wielowątkowości – każdy wątek może posiadać własny
NSManagedObjectContext. - Integracja z iCloud i CloudKit – synchronizacja danych pomiędzy urządzeniami Apple.
Ograniczenia i krytyka
- Brak pełnej kompatybilności z rzutowaniem SQL – nie wszystkie funkcje bazy są dostępne w warstwie abstrakcji.
- Wysoki koszt pamięciowy przy nieoptymalnym użyciu faulting i fetch request.
- Konieczność znajomości specjalnych narzędzi (Xcode, Instruments) do diagnostyki wydajności.
- Trudność migracji schematu (Core Data Migration) w dużych projektach.
Przykładowe zastosowania
Core Data jest wykorzystywany w wielu aplikacjach Apple, m.in. w:
- Kliencie poczty Mail.
- Notatniku Notes.
- Bankowości mobilnej i aplikacjach HealthKit.
- Grach i aplikacjach SpriteKit, gdzie służy do przechowywania postępów gracza.
Porównanie z innymi technologiami
| Technologia | Platforma | Model programistyczny | Typ przechowywania | Obsługa synchronizacji |
|---|---|---|---|---|
| Core Data | Apple (iOS, macOS, itp.) | Obiektowy (ORM) | SQLite, binary, XML, CloudKit | iCloud, CloudKit |
| Realm | Wieloplatformowy | Obiektowy | Własny format | Realm Sync |
| SQLite | Wszystkie | Relacyjny (SQL) | Plik .sqlite | Brak wbudowanego |
| Room (Android) | Android | ORM | SQLite | Firebase, własne rozwiązania |
Przyszłość
Od 2022 roku Apple koncentruje się na integracji Core Data z SwiftData – nowym API, które ma uprościć deklaratywne definiowanie modeli oraz jeszcze lepszą współpracę z SwiftUI. W kolejnych wersjach planowane jest rozbudowanie wsparcia dla wielowątkowości oraz dalsza optymalizacja pod kątem Apple Silicon.