CoreData vs Realm (σε Swift)

Έχοντας αλλάξει από το CoreData στο Realm, σκέφτηκα ότι θα ήταν χρήσιμο να σημειώσω τις βασικές διαφορές.

Πρώτον, δεν χρησιμοποιώ τα χαρακτηριστικά του cloud του Realm και πιθανότατα θα χρησιμοποιήσω το iCloud για συγχρονισμό δεδομένων. Επιλέγω δωρεάν υπηρεσίες και το Realm είναι ελεύθερο να χρησιμοποιήσει αν δεν χρειάζεται να συγχρονίσετε μέσω της πλατφόρμας του cloud.

Τόσο το CoreData όσο και το Realm χρησιμοποιούν τις κλάσεις που βασίζονται σε Objective-C για να παράγουν πραγματικά αντικείμενα που υποστηρίζονται από κάποιο είδος καταστήματος. Το CoreData χρησιμοποιεί μια βάση δεδομένων sqllite από προεπιλογή, έτσι θα χρειαστείτε μερικά εργαλεία sqllite για να δείτε και να επεξεργαστείτε τη βάση δεδομένων με το χέρι. Το Realm χρησιμοποιεί μια ιδιόκτητη μορφή αλλά έχει ένα πρόγραμμα περιήγησης διαθέσιμο δωρεάν στο Mac App Store για να προβάλετε και να επεξεργαστείτε τη βάση δεδομένων.

Από το κουτί Realm είναι πολύ πιο εύκολο να πάρει το κεφάλι σας γύρω από CoreData. Το CoreData διαχειρίζεται αντικείμενα με σαφή τρόπο σε ένα ManagedObjectContext που πρέπει να αποθηκεύσετε για να διατηρήσετε οποιεσδήποτε αλλαγές ενώ το Realm διατηρεί όλες τις αλλαγές αμέσως μέσα στα μπλοκ εγγραφής. Για να χρησιμοποιήσετε το CoreData χρειάζεστε μια βαθιά κατανόηση του API, το οποίο είναι κατανεμημένο σε διάφορες σχετικές κλάσεις. Μπορείτε σχεδόν να πηδήσετε κατευθείαν με το Realm. Ένα σημαντικό πλεονέκτημα που έχω βρει είναι ότι επειδή οι αλλαγές του Realm επιμένουν αμέσως, αν η εφαρμογή σας καταρρεύσει ή κλείσετε τον προσομοιωτή, μπορείτε να ελέγξετε τη βάση δεδομένων για να δείτε πώς φαίνεται. Χρησιμοποιώντας το CoreData, απλά να σταματήσετε τον εξομοιωτή χωρίς να αποθηκεύσετε πρώτα το περιβάλλον, σημαίνει ότι χάνετε την κατάσταση της βάσης δεδομένων σε εκείνο το σημείο. Αυτό είναι αρκετό από μόνο του για να με κάνει να κολλήσω με το Realm. Μπορεί να είναι λιγότερο αποτελεσματική και θα μπορούσατε μόνο να αποθηκεύσετε το πλαίσιο σε κάθε αλλαγή στο CoreData, αλλά αισθάνεστε σαν να εργάζεστε εναντίον του API όταν αρχίζετε να κάνετε τέτοια πράγματα. Αξίζει να θυμηθούμε ότι το Realm μπλοκάρει κατά την εγγραφή και η πρόσβαση θα προκαλέσει εξαίρεση νήμα αν δεν εκτελεστεί στο κύριο νήμα.

Η δημιουργία ενός σχήματος διαφέρει επίσης, χρησιμοποιώντας το CoreData που δημιουργείτε ένα μοντέλο στο XCode το οποίο δημιουργεί τις τάξεις που χρησιμοποιούνται για την εγκατάσταση των δεδομένων σε αντικείμενα. Και πάλι, το Realm είναι απλούστερο δεδομένου ότι απλά πρέπει να κληρονομήσετε από το Object και να επισημάνετε τις ιδιότητες που θέλετε να αποθηκεύσετε ως δυναμική @objc. Υπάρχουν πολλές λειτουργίες που μπορείτε να αντικαταστήσετε για να προσαρμόσετε τον τρόπο με τον οποίο επιμένουν τα αντικείμενα σας κ.λπ. Μου αρέσει η οπτική παρουσίαση του μοντέλου στο XCode και είναι ευχερέστερα ευκολότερο να δουλέψετε με σχέσεις one-to-many και πολλές με πολλές το πρόγραμμα επεξεργασίας μοντέλου XCode από το να χρησιμοποιήσετε τη λειτουργία LinkingObjects () στο Realm.

Σκέφτομαι μια τάξη Realm ως ορισμό πίνακα και μπορείτε να πάρετε εύκολα ένα ζωντανό σύνολο αποτελεσμάτων καλώντας το realm.objects (MyObject.self) που θα συνεχίσει να πυροβολεί καθώς προστίθενται, διαγράφονται ή ενημερώνονται σειρές. Μπορείτε να προσθέσετε πρόβατα στα αποτελέσματα που έχουν οριστεί, ώστε να έχετε προ-φιλτραρισμένα και ταξινομημένα αποτελέσματα ή μπορείτε να τα αντιστοιχίσετε σε έναν πίνακα. Στο CoreData μπορείτε να κάνετε παρόμοια πράγματα, αλλά και πάλι το API στο Realm είναι απλούστερο.

Το CoreData σάς δίνει τη δυνατότητα να ρυθμίσετε τον τρόπο αντιμετώπισης των null αναφορών, που είναι χρήσιμο αν θέλετε να καταργηθούν οι διαγραφές και να μην αφήσετε τη βάση δεδομένων σας γεμάτη με nils ή αναφορές σε αντικείμενα που δεν υπάρχουν πλέον. Αυτό υποτίθεται ότι έρχεται σε μια νέα έκδοση, αλλά μέχρι τότε έχω γράψει ένα API Cascading Deletion για Realm το οποίο θα δημοσιεύσω εν ευθέτω χρόνω.

Συμπερασματικά, έχοντας περάσει από το σκληρό μόσχευμα της επαρκούς εκμάθησης για το CoreData για να το χρησιμοποιήσω, ήμουν απρόθυμος να στραφώ σε οτιδήποτε άλλο εκτός από τη σχετική απλότητα του Realm και το γεγονός ότι είναι λίγο πιο φιλικό όταν ξεκινάει επανειλημμένα και παραιτείται από τον προσομοιωτή σημαίνει ότι θα συνιστούσα τη χρήση του Realm μέσω του CoreData.