- Αντικαθιστά τον χειροκίνητο χειρισμό SQLite με ένα επίπεδο αφαίρεσης που επικυρώνει τα ερωτήματα κατά τη στιγμή της μεταγλώττισης.
- Είναι δομημένο χρησιμοποιώντας τρία βασικά στοιχεία: Οντότητες για τους πίνακες, DAO για τις λειτουργίες και την κλάση Database για τη σύνδεση.
- Επιτρέπει τη διαχείριση σύνθετων σχέσεων και μετεγκαταστάσεων σχημάτων για την αποτροπή απώλειας δεδομένων κατά την ενημέρωση της εφαρμογής.
- Ενσωματώνεται απρόσκοπτα στην αρχιτεκτονική MVVM μέσω της χρήσης αποθετηρίων, ViewModel και ασύγχρονων ροών όπως το Flow.
Όταν σχεδιάζετε μια εφαρμογή που χειρίζεται σημαντικό όγκο οργανωμένων δεδομένων, συνειδητοποιείτε ότι η συνεχής εξάρτηση από μια σύνδεση στο διαδίκτυο αποτελεί κίνδυνο. Ο καλύτερος τρόπος για να αποτρέψετε την εφαρμογή σας από το να μην ανταποκρίνεται όταν ο χρήστης εισέρχεται σε μια σήραγγα ή ξεμείνει από δεδομένα είναι να εφαρμόσετε ένα τοπικό σύστημα αποθήκευσης . Εδώ έρχεται το Room, ένα εργαλείο που μας επιτρέπει να αποθηκεύουμε πληροφορίες στη συσκευή, ώστε η εμπειρία χρήστη να είναι απρόσκοπτη και διαθέσιμη ανά πάσα στιγμή.
Βασικά, το Room λειτουργεί ως μια έξυπνη γέφυρα πάνω από το SQLite. Ενώ το SQLite είναι πολύ ισχυρό, η άμεση εργασία με αυτό μπορεί να είναι πονοκέφαλος, επειδή πρέπει να γράφετε SQL χειροκίνητα και δεν ξέρετε αν έχετε κάνει κάποιο λάθος μέχρι η εφαρμογή να καταρρεύσει κατά τον χρόνο εκτέλεσης. Το Room λύνει αυτό το πρόβλημα παρέχοντάς μας ένα επίπεδο αφαίρεσης που ελέγχει τα ερωτήματα ενώ εσείς μεταγλωττίζετε τον κώδικα, εξοικονομώντας μας πολύ χρόνο εντοπισμού σφαλμάτων και εξαλείφοντας αυτόν τον επαναλαμβανόμενο κώδικα που συνήθως κουράζει κάθε προγραμματιστή.

Οι βασικοί πυλώνες του δωματίου

Για να ρυθμίσετε μια βάση δεδομένων με αυτήν τη βιβλιοθήκη, πρέπει να κατανοήσετε τρία βασικά στοιχεία που λειτουργούν μαζί. Πρώτον, έχουμε τις οντότητες δεδομένων , οι οποίες είναι απλώς κλάσεις που καθορίζουν πώς θα φαίνεται ο πίνακας στη βάση δεδομένων. Κάθε παρουσία αυτής της κλάσης αντιπροσωπεύει μια γραμμή στον πίνακα.
Έπειτα, υπάρχουν τα Αντικείμενα Πρόσβασης Δεδομένων (DAO) . Αυτές οι διεπαφές αποτελούν την καρδιά της αλληλεπίδρασης, καθώς σε αυτές καθορίζετε τις μεθόδους εισαγωγής, διαγραφής ή αναζήτησης δεδομένων. Αντί να γράφετε σύνθετα ερωτήματα στη μέση της επιχειρηματικής σας λογικής, απλώς καλείτε μια μέθοδο στο DAO και είστε έτοιμοι. Τέλος, υπάρχει η κλάση βάσης δεδομένων , η οποία είναι το κύριο σημείο πρόσβασης και είναι υπεύθυνη για τη διαχείριση της υποκείμενης σύνδεσης.
Διαμόρφωση και θέση σε λειτουργία

Για να ξεκινήσετε, πρέπει να προσθέσετε τις σωστές εξαρτήσεις στο αρχείο build.gradle. Ανάλογα με την έκδοσή σας, το Room ενδέχεται να απαιτεί KSP (Kotlin Symbol Processing) ή kapt για την επεξεργασία σχολιασμών. Είναι απαραίτητο να συμπεριλάβετε τη βιβλιοθήκη χρόνου εκτέλεσης, τον μεταγλωττιστή και, εάν εργάζεστε με το Kotlin, την επέκταση coroutine (room-ktx) για να αποτρέψετε τις λειτουργίες από το να μπλοκάρουν τη διεπαφή χρήστη.
Σχεδιασμός των οντοτήτων και των πινάκων σας
Για να μετατρέψουμε μια κλάση σε πίνακα, χρησιμοποιούμε την σχολίαση @Entity. Μπορείτε να αφήσετε το Room να αποφασίσει το όνομα ή να αντιστοιχίσετε ένα μόνοι σας χρησιμοποιώντας την ιδιότητα tableName. Ο ορισμός ενός πρωτεύοντος κλειδιού χρησιμοποιώντας το @PrimaryKey είναι υποχρεωτικός . Αυτό μπορεί να δημιουργηθεί αυτόματα εάν δεν θέλετε να διαχειρίζεστε τα αναγνωριστικά χειροκίνητα. Εάν έχετε πεδία που δεν θέλετε να αποθηκεύονται στη βάση δεδομένων, όπως μια εικόνα που απαιτεί μεγάλη μνήμη, μπορείτε να χρησιμοποιήσετε το @Ignore για να τα αγνοήσετε.
Σε περιπτώσεις όπου χρειάζεται να αποθηκεύσετε σύνθετους τύπους δεδομένων που το SQLite δεν κατανοεί από προεπιλογή (όπως μια ημερομηνία), πρέπει να δημιουργήσετε μετατροπείς τύπων . Χρησιμοποιώντας το `@TypeConverter`, διδάσκετε στο Room πώς να μετατρέψει αυτό το σύνθετο αντικείμενο σε έναν πρωτόγονο τύπο, όπως έναν `Long`, και αντίστροφα, και στη συνέχεια να καταχωρίσει αυτούς τους μετατροπείς στην κύρια κλάση βάσης δεδομένων.
Κατανόηση των DAO και των ερωτημάτων
Η μαγεία συμβαίνει στο DAO. Έχετε βολικές μεθόδους όπως @Insert, @Update και @Delete . Για εισαγωγές, μπορείτε να ορίσετε στρατηγικές σύγκρουσης, όπως REPLACE, έτσι ώστε εάν υπάρχουν ήδη δεδομένα, να αντικαθίστανται αυτόματα. Για πιο συγκεκριμένα ερωτήματα, χρησιμοποιούμε το @Query , όπου γράφουμε την SQL. Η επιλογή Room είναι εξαιρετική επειδή εάν κάνετε λάθος στο όνομα μιας στήλης στην SQL, θα σας προειδοποιήσει πριν εγκαταστήσετε την εφαρμογή.
Δεδομένου ότι οι λειτουργίες της βάσης δεδομένων είναι αργές, δεν πρέπει ποτέ να εκτελούνται στο κύριο νήμα . Επομένως, είναι καλύτερο να επισημαίνετε τις συναρτήσεις ως `suspend` για χρήση με τις συναρτήσεις Kotlin ή να τις ρυθμίζετε να επιστρέφουν παρατηρήσιμους τύπους όπως `Flow` ή `LiveData` , επιτρέποντας στη διεπαφή να ενημερώνεται αυτόματα μόλις αλλάξουν τα δεδομένα στον πίνακα.
Διαχείριση σχέσεων δεδομένων
Στον πραγματικό κόσμο, τα δεδομένα σχετίζονται. Το Room αποφεύγει την αργή φόρτωση για να αποτρέψει το πάγωμα του UI, επομένως χρησιμοποιούμε ενδιάμεσες κλάσεις με `@Relation` . Για μια σχέση ένα-προς-ένα ή ένα-προς-πολλά, απλώς ορίστε μια κλάση που περιέχει την κύρια οντότητα και μια λίστα της σχετικής οντότητας. Για μια σχέση πολλά-προς-πολλά , θα χρειαστεί να δημιουργήσετε έναν πίνακα διασταυρούμενης αναφοράς που συνδέει τα ID και των δύο οντοτήτων.
Προηγμένη διαχείριση και μετεγκαταστάσεις
Όταν η εφαρμογή σας μεγαλώνει και χρειάζεται να προσθέσετε μια στήλη σε έναν πίνακα, δεν μπορείτε απλώς να αλλάξετε την κλάση. Πρέπει να αυξήσετε την έκδοση της βάσης δεδομένων και να ορίσετε ένα αντικείμενο Migration. Εάν δεν θέλετε να γράψετε την SQL μετεγκατάστασης, οι σύγχρονες εκδόσεις του Room προσφέρουν το @AutoMigration , το οποίο κάνει τη δύσκολη δουλειά για εσάς κάθε φορά που εξάγετε το σχήμα.
Εάν μετεγκαθιστάτε μια παλαιότερη εφαρμογή που χρησιμοποιεί ήδη καθαρό SQLite, η διαδικασία περιλαμβάνει την προσθήκη σχολίων στα μοντέλα σας, τη δημιουργία των DAO και τον ορισμό μιας κενής διαδρομής μετεγκατάστασης, καθώς η δομή δεδομένων δεν αλλάζει, μόνο ο τρόπος πρόσβασης σε αυτήν. Για όσους είναι πιο προχωρημένοι, είναι επίσης δυνατή η μετάδοση της βάσης δεδομένων από ένα προϋπάρχον αρχείο χρησιμοποιώντας το `createFromAsset`.
Προτεινόμενη αρχιτεκτονική: Αποθετήριο και ViewModel

Για να αποφύγετε το χάος στον κώδικα, είναι καλύτερο να ακολουθήσετε την αρχιτεκτονική MVVM. Το Αποθετήριο λειτουργεί ως μεσολαβητής. Αποφασίζει εάν τα δεδομένα θα ανακτηθούν από το δίκτυο ή θα διαβαστούν από την τοπική προσωρινή μνήμη του Δωματίου. Το ViewModel, με τη σειρά του, είναι υπεύθυνο για την εμφάνιση αυτών των δεδομένων στην προβολή. Υλοποιώντας τη βάση δεδομένων ως Singleton , διασφαλίζουμε ότι δεν θα είναι ανοιχτές πολλαπλές παρουσίες ταυτόχρονα, κάτι που θα καταναλώσει υπερβολικούς πόρους της συσκευής.
Η εφαρμογή Implementing Room μεταμορφώνει την ευρωστία μιας εφαρμογής Android, επιτρέποντας ασφαλή, αποτελεσματική και εύκολη στη διατήρηση της διατήρησης δεδομένων. Ενσωματώνοντας σαφώς καθορισμένες οντότητες, βελτιστοποιημένα DAO και μια αρχιτεκτονική που βασίζεται σε αποθετήριο, επιτυγχάνετε μια εφαρμογή ικανή για λειτουργία εκτός σύνδεσης και ανώτερη ταχύτητα απόκρισης, εξαλείφοντας τους χειροκίνητους κινδύνους του SQLite και αξιοποιώντας την επαλήθευση κατά τον χρόνο μεταγλώττισης.