Το Core Data είναι ένα πλαίσιο διαχείρισης δεδομένων από την Apple που παρέχει αντικειμενο-σχεσιακή αντιστοίχιση για iOS, macOS, tvOS και watchOS. Αυτοματοποιεί την αποθήκευση, ανάκτηση και φιλτράρισμα αντικειμένων στην εφαρμογή, λειτουργώντας πάνω από SQLite, XML ή δυαδική αποθήκη. Σύμφωνα με το Apple Core Data Documentation, το πλαίσιο χρησιμοποιεί τις έννοιες του Managed Object Context και NSPersistentContainer για τη διαχείριση της στοίβας διαμονιμότητας.
Κύρια σημεία
Core Data — είναι ένα πλαίσιο διαχείρισης γράφου αντικειμένων και διαμονιμότητας, μέρος του Cocoa Touch. Σε αντίθεση με μια διαδεδομένη εσφαλμένη αντίληψη, το Core Data δεν είναι βάση δεδομένων, αλλά ένα επίπεδο διαχείρισης αντικειμένων που μπορεί να χρησιμοποιεί την SQLite ως μία από τις αποθήκες. Κύρια αποστολή του Core Data είναι η παρακολούθηση αλλαγών αντικειμένων, η διαχείριση του κύκλου ζωής τους και ο συγχρονισμός της κατάστασης με τον δίσκο.
Το πλαίσιο παρέχει έναν γράφο αντικειμένων, όπου κάθε Managed Object παρακολουθείται από το περιβάλλον για αλλαγές. Κατά την αποθήκευση του περιβάλλοντος, όλα τα τροποποιημένα, προστεθέντα και διαγραμμένα αντικείμενα επιβεβαιώνονται στη μόνιμη αποθήκη με μία συναλλαγή. Αυτό απαλλάσσει τον προγραμματιστή από το γράψιμο SQL ερωτημάτων και τη χειροκίνητη διαχείριση συναλλαγών.
Σύμφωνα με στατιστικά του Swift Developer Survey (2025), το Core Data χρησιμοποιείται στο 52% των εφαρμογών iOS που εργάζονται με τοπικά δεδομένα. Παρά την εμφάνιση σύγχρονων εναλλακτικών (SwiftData, Realm), το Core Data παραμένει το κύριο πλαίσιο σε υπάρχοντα έργα Apple χάρη στην ωριμότητα και τη βαθιά ενσωμάτωση με το σύστημα.
Χρησιμοποιήστε το Core Data για έργα με μοντέλο δεδομένων μέσης πολυπλοκότητας, όπου χρειάζονται σχέσεις μεταξύ αντικειμένων, αναίρεση αλλαγών και αυτόματη προσωρινή αποθήκευση μέσω του μηχανισμού faulting.
Η αρχιτεκτονική του Core Data είναι χτισμένη γύρω από την έννοια του Managed Object Context — ενός χώρου εργασίας που παρακολουθεί όλες τις αλλαγές αντικειμένων. Το περιβάλλον υποστηρίζει αναίρεση (undo/redo) μέσω του ενσωματωμένου NSUndoManager, που επιτρέπει την υλοποίηση προσχεδίων και ακύρωση ενεργειών χωρίς χειροκίνητη αποθήκευση στιγμιοτύπων κατάστασης. Κατά την κλήση save(), το περιβάλλον επιβεβαιώνει όλες τις αλλαγές με μία συναλλαγή στη μόνιμη αποθήκη, εγγυώμενο ατομικότητα και συνέπεια δεδομένων.
Το μοντέλο δεδομένων Core Data ορίζεται στο αρχείο .xcdatamodeld — τον οπτικό επεξεργαστή Xcode, όπου περιγράφονται όλες οι Οντότητες, τα χαρακτηριστικά και οι σχέσεις τους. Κατά τη μεταγλώττιση, το μοντέλο σειριοποιείται σε .momd και φορτώνεται μέσω του NSManagedObjectModel.
Entity — είναι μια περιγραφή ενός τύπου δεδομένων, ανάλογη με έναν πίνακα στην SQL. Κάθε Entity περιέχει ένα σύνολο Attributes — ονομασμένα πεδία με τύπο δεδομένων (String, Integer, Date, Boolean, Data). Σε αντίθεση με το Room, το Core Data απαιτεί ρητή επιλογή τύπου για κάθε χαρακτηριστικό μέσω του επεξεργαστή μοντέλου.
Relationship — σχέση μεταξύ Οντοτήτων, ανάλογη με ξένο κλειδί στην SQL. Το Core Data υποστηρίζει όλους τους τύπους σχέσεων: ένα-προς-ένα, ένα-προς-πολλά και πολλά-προς-πολλά. Για κάθε σχέση διαμορφώνεται ένας Delete Rule (Cascade, Nullify, Deny) — η συμπεριφορά κατά τη διαγραφή του συνδεδεμένου αντικειμένου.
| Delete Rule | Συμπεριφορά κατά τη διαγραφή | Παράδειγμα εφαρμογής |
|---|---|---|
| Cascade | Διαγράφει όλα τα συνδεδεμένα αντικείμενα | Διαγραφή παραγγελίας μαζί με τα στοιχεία |
| Nullify | Μηδενίζει την αντίστροφη σχέση | Διαγραφή συγγραφέα χωρίς διαγραφή βιβλίων |
| Deny | Μπλοκάρει τη διαγραφή αν υπάρχουν συνδεδεμένα αντικείμενα | Προστασία από διαγραφή κατηγορίας με προϊόντα |
Η επιλογή Delete Rule είναι κρίσιμη για την ακεραιότητα δεδομένων: το Cascade χωρίς έλεγχο μπορεί να διαγράψει το ένα τρίτο της βάσης, ενώ το Deny μπορεί να μπλοκάρει τη λειτουργία με ένα ακατανόητο σφάλμα. Σε κώδικα παραγωγής, συνιστάται το Nullify με χειροκίνητη επεξεργασία ορφανών εγγραφών.
Στον επεξεργαστή μοντέλου Xcode, ο προγραμματιστής μπορεί να ορίσει όχι μόνο Οντότητες και χαρακτηριστικά, αλλά και constraints (περιορισμοί μοναδικότητας), ευρετήρια για επιτάχυνση ερωτημάτων και default values για χαρακτηριστικά. Όλες οι αλλαγές μοντέλου μεταγλωττίζονται στο αρχείο .momd, το οποίο φορτώνεται κατά την αρχικοποίηση του NSPersistentContainer. Η έκδοση μοντέλου (Model Versioning) επιτρέπει τη διατήρηση πολλαπλών εκδόσεων του σχήματος και την εκτέλεση μετεγκατάστασης μεταξύ τους.
NSPersistentContainer — ένα ενοποιημένο αντικείμενο που διαχειρίζεται τη στοίβα Core Data από iOS 10 και macOS 10.12. Ενθυλακώνει τα NSManagedObjectModel, NSPersistentStoreCoordinator και NSManagedObjectContext, αυτοματοποιώντας τη φόρτωση μοντέλου και τη διαμόρφωση αποθήκης. Για παλαιότερες εκδόσεις, η στοίβα χτιζόταν χειροκίνητα, αλλά τώρα αυτό δεν συνιστάται.
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 συνδέει το μοντέλο με τη φυσική αποθήκη στο δίσκο. Το Core Data υποστηρίζει διάφορους τύπους αποθηκών: SQLite (συνιστάται), Binary και In-Memory. Η αποθήκη SQLite υποστηρίζει μεταναστεύσεις, προσαυξητική δημιουργία αντιγράφων ασφαλείας και ανθεκτικότητα σε σφάλματα κατά τη διαδικασία εγγραφής.
NSFetchRequest — ένα αντικείμενο που περιγράφει ένα ερώτημα προς την αποθήκη Core Data. Περιέχει το όνομα της Οντότητας, το κατηγόρημα φιλτραρίσματος, τη ταξινόμηση και ρυθμίσεις ανάκτησης. Το ερώτημα εκτελείται μέσω context.fetch(), το οποίο επιστρέφει έναν πίνακα 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 υποστηρίζει σύνθετες συνθήκες: LIKE, IN, BETWEEN, CONTAINS[c] (χωρίς διάκριση πεζών-κεφαλαίων), SUBQUERY για ένθετα ερωτήματα σε συνδεδεμένες Οντότητες. Το Core Data υποστηρίζει επίσης το NSFetchedResultsController — μια κλάση για δραστική φόρτωση δεδομένων σε UITableView, που παρακολουθεί αυτόματα αλλαγές και ενημερώνει τον πίνακα με κινούμενες ενότητες.
Η εργασία με 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 να αντικατοπτρίζει τα νέα δεδομένα. Η Apple συνιστά λειτουργίες 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 ως αποθήκη. Σε αντίθεση με την άμεση SQLite, το Core Data παρακολουθεί αλλαγές αντικειμένων, διαχειρίζεται αναίρεση και παρέχει γράφο αντικειμένων με faulting και προσωρινή αποθήκευση. Η SQLite δίνει περισσότερο έλεγχο στα ερωτήματα, αλλά απαιτεί γράψιμο SQL και χειροκίνητη διαχείριση συναλλαγών.
Core Data υποστηρίζει ελαφριά μετεγκατάσταση (Lightweight Migration) για μη καταστροφικές αλλαγές: προσθήκη χαρακτηριστικού, μετονομασία, ορισμός προεπιλεγμένης τιμής. Για σύνθετες αλλαγές δημιουργείται Mapping Model. Η ελαφριά μετεγκατάσταση ενεργοποιείται με τη σημαία shouldMigrateAutomatically στο NSPersistentStoreDescription.
Ναι, το Core Data ενσωματώνεται με το SwiftUI μέσω του περιτυλίγματος @FetchRequest για ερωτήματα και @ObservedObject για εγγραφή σε αλλαγές. Το SwiftUI ενημερώνει αυτόματα το View όταν αλλάζει το ManagedObject, καθιστώντας το Core Data και το SwiftUI μια συμβατή στοίβα για διαχείριση κατάστασης.
Fault — είναι ένα ελαφρύ υπόθεση στο γράφο Core Data που δεν περιέχει δεδομένα του συνδεδεμένου αντικειμένου. Κατά τον ορισμό fault (μέσω refreshObject:) τα δεδομένα εκφορτώνονται από τη μνήμη. Κατά την πρόσβαση σε ιδιότητα, το fault συμπληρώνεται αυτόματα με δεδομένα από την αποθήκη — αυτός είναι ένας μηχανισμός καθυστερημένης φόρτωσης που βελτιστοποιεί τη χρήση μνήμης.
Για δοκιμές χρησιμοποιήστε τον τύπο αποθήκης In-Memory: NSPersistentStoreDescription με NSInMemoryStoreType. Ο περιέκτης δημιουργείται με το μοντέλο από το πακέτο δοκιμής. Μετά από κάθε δοκιμή, διαγράψτε όλα τα αντικείμενα ή αναδημιουργήστε τον περιέκτη — αυτό εγγυάται την απομόνωση των δοκιμαστικών περιπτώσεων μεταξύ τους.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης