Το ObjectBox είναι μια υψηλής απόδοσης NoSQL βάση δεδομένων βελτιστοποιημένη για κινητές και ακραίες συσκευές. Σε αντίθεση με την SQLite, χρησιμοποιεί τη δική της μορφή αποθήκευσης που βασίζεται σε επίπεδα αρχεία χωρίς επίπεδο SQL. Σύμφωνα με το ObjectBox Benchmarks, 2024, το ObjectBox εκτελεί λειτουργίες εισαγωγής και ανάγνωσης 10–100 φορές ταχύτερα από την SQLite σε συσκευές Android, καθιστώντας το την καλύτερη επιλογή για εφαρμογές κινητών υψηλού φόρτου.
Κύρια σημεία
ObjectBox είναι μια in-memory NoSQL βάση δεδομένων που αναπτύχθηκε από τη γερμανική εταιρεία ObjectBox.io. Σε αντίθεση με τις παραδοσιακές σχεσιακές βάσεις δεδομένων, το ObjectBox αποθηκεύει αντικείμενα απευθείας σε επίπεδα αρχεία χρησιμοποιώντας τη δική του μορφή SLOT (Super Lightweight Object Tree). Αυτό εξαλείφει την επιβάρυνση του ORM και του αναλυτή SQL. Η μορφή SLOT είναι βελτιστοποιημένη για λειτουργία σε συσκευές με περιορισμένη μνήμη: τα δεδομένα ανασυγκροτούνται αυτόματα και το μέγεθος της βάσης δεδομένων είναι κατά μέσο όρο 4–6 φορές μικρότερο από μια ισοδύναμη βάση SQLite με τον ίδιο αριθμό εγγραφών.
Το ObjectBox υποστηρίζει όλες τις κύριες κινητές πλατφόρμες: Android, iOS και Flutter. Για Android, η δημιουργία κώδικα είναι διαθέσιμη μέσω του ObjectBox Gradle Plugin, το οποίο επεξεργάζεται σχολιασμένες οντότητες και δημιουργεί κλάσεις Box για εργασία με δεδομένα. Για Flutter, χρησιμοποιείται ένα εγγενές πρόσθετο με περιτύλιγμα Dart. Εκτός από κινητές πλατφόρμες, το ObjectBox λειτουργεί σε Linux, macOS, Windows και WebAssembly, επιτρέποντας την επαναχρησιμοποίηση του μοντέλου δεδομένων μεταξύ της εφαρμογής κινητού και του συγχρονισμού διακομιστή.
Σύμφωνα με δεδομένα έρευνας του ObjectBox (2023), η βάση δεδομένων χρησιμοποιείται σε περισσότερες από 5000 εφαρμογές στο Google Play, συμπεριλαμβανομένων εφαρμογών με κοινό άνω των 10 εκατομμυρίων χρηστών. Κύρια σενάρια: προσωρινή αποθήκευση δεδομένων, εργασία σε λειτουργία εκτός σύνδεσης και αποθήκευση χρονοσειρών (IoT). Το ObjectBox είναι ιδιαίτερα δημοφιλές σε εφαρμογές παρακολούθησης υγείας και φυσικής κατάστασης, όπου απαιτείται γρήγορη καταγραφή μετρήσεων αισθητήρων στη συσκευή χωρίς μόνιμη σύνδεση στο διαδίκτυο και συλλογή αναλυτικών στοιχείων από πολλές συσκευές.
ObjectBox εμφανίστηκε ως εναλλακτική λύση για τα Realm και SQLite στην πλατφόρμα Android. Η πρώτη σταθερή έκδοση κυκλοφόρησε το 2018. Βασική διαφορά από το Realm — το ObjectBox δεν έχει περιορισμούς GPL (χρησιμοποιεί Apache 2.0) και υποστηρίζει περισσότερες πλατφόρμες: από κινητές συσκευές έως διακομιστές Linux.
ObjectBox παρέχει: αυτόματη δημιουργία κλάσεων Box, ενσωματωμένα ευρετήρια για γρήγορη αναζήτηση, συναλλαγές με υποστήριξη αναίρεσης, αντιδραστικά ερωτήματα μέσω RxJava και Kotlin Flow, καθώς και συγχρονισμό μεταξύ συσκευών μέσω ObjectBox Sync (ιδιόκτητο πρωτόκολλο). Σε αντίθεση με το Firebase Realtime Database, το ObjectBox Sync λειτουργεί με μοντέλο peer-to-peer χωρίς κεντρικό διακομιστή, μειώνοντας την καθυστέρηση και το κόστος υποδομής.
ObjectBox αποθηκεύει δεδομένα στη δική του δυαδική μορφή .mdb (ObjectBox Data File). Κάθε οντότητα αντιστοιχίζεται σε ένα αρχείο, όπου οι εγγραφές αποθηκεύονται διαδοχικά με σταθερή μετατόπιση. Αυτό επιτρέπει την ανάγνωση και εγγραφή μεμονωμένων αντικειμένων χωρίς πλήρη σάρωση του αρχείου.
Για εργασία με το ObjectBox δεν απαιτείται SQL: τα ερωτήματα δημιουργούνται μέσω fluent-API στον κώδικα. Ο μεταγλωττιστής δημιουργεί βοηθητικές κλάσεις MyObjectBox και κουτιά (Box) που ενσωματώνουν όλες τις λειτουργίες CRUD. Το μοντέλο δεδομένων περιγράφεται μέσω σχολιασμών @Entity, @Id, @Index και @Relation.
// Σύνδεση ObjectBox σε Android
class App: Application() {
lateinit var boxStore: BoxStore
override fun onCreate() {
super.onCreate()
boxStore = MyObjectBox.builder()
.androidContext(this)
.build()
}
}
Σύμφωνα με επίσημα σημεία αναφοράς, το ObjectBox υπερτερεί σημαντικά της SQLite σε ταχύτητα λειτουργιών, ειδικά σε μαζική εισαγωγή και μαζική ανάγνωση. Ωστόσο, η SQLite παραμένει το de facto πρότυπο για εφαρμογές κινητών λόγω της διάδοσης και της ενσωματωμένης υποστήριξης SQL.
| Λειτουργία | ObjectBox | SQLite | Διαφορά |
|---|---|---|---|
| Εισαγωγή (1000 εγγραφές) | ~5 ms | ~180 ms | x36 ταχύτερα |
| Ανάγνωση (1000 εγγραφές) | ~3 ms | ~70 ms | x23 ταχύτερα |
| Ενημέρωση (1000 εγγραφές) | ~6 ms | ~150 ms | x25 ταχύτερα |
| Αναζήτηση βάσει ευρετηρίου | ~0.1 ms | ~2 ms | x20 ταχύτερα |
| Μέγεθος βάσης (1000 αντικείμενα) | ~28 KB | ~112 KB | 4 φορές μικρότερο |
ObjectBox υστερεί έναντι της SQLite σε σενάρια όπου απαιτούνται σύνθετα ερωτήματα JOIN, συναθροιστικές συναρτήσεις (SUM, COUNT με ομαδοποίηση) ή ενσωμάτωση με υπάρχον σχήμα SQL. Εάν το έργο χρησιμοποιεί ήδη SQLite με Room ORM, η μετεγκατάσταση σε ObjectBox θα απαιτήσει επανεγγραφή όλης της λογικής πρόσβασης δεδομένων. Το ObjectBox επίσης δεν υποστηρίζει προσαρμοσμένα ερωτήματα SQL — μόνο fluent-API. Ωστόσο, για τυπικές λειτουργίες CRUD και προσωρινή αποθήκευση, το ObjectBox παρέχει αύξηση απόδοσης έως και 100 φορές, κάτι που επιβεβαιώνεται από επίσημα σημεία αναφοράς σε συσκευές Android με διαφορετικές εκδόσεις OS.
ObjectBox χρησιμοποιεί σχολιασμούς για τον ορισμό οντοτήτων. Μετά τη μεταγλώττιση, δημιουργούνται κλάσεις Box με μεθόδους put, get, remove και query. Παρακάτω παρουσιάζονται τυπικές λειτουργίες για το μοντέλο Task σε μια εφαρμογή λίστας εργασιών.
Κάθε οντότητα σχολιάζεται με @Entity. Το πεδίο με @Id γίνεται το πρωτεύον κλειδί, το @Index επιταχύνει την αναζήτηση βάσει πεδίου. Το ObjectBox υποστηρίζει αυτόματη δημιουργία ID σε τιμή 0.
@Entity
data class Task(
@Id var id: Long = 0,
@Index var title: String = "",
var isCompleted: Boolean = false,
var priority: Int = 0
)
Box είναι η κύρια κλάση για εργασία με οντότητες. Η μέθοδος put() αποθηκεύει ή ενημερώνει το αντικείμενο, η get() διαβάζει βάσει ID, η remove() διαγράφει. Όλες οι βασικές λειτουργίες είναι σύγχρονες και εκτελούνται στο νήμα που τις καλεί.
val taskBox: Box<Task> = boxStore.boxFor(Task::class.java)
// Δημιουργία
val task = Task(title = "Αγορά προϊόντων", priority = 3)
val newId = taskBox.put(task)
// Ανάγνωση
val savedTask = taskBox.get(newId)
// Ενημέρωση
savedTask.isCompleted = true
taskBox.put(savedTask)
// Διαγραφή
taskBox.remove(newId)
ObjectBox υποστηρίζει αντιδραστικά ερωτήματα μέσω .subscribe(). Ο συνδρομητής λαμβάνει ειδοποιήσεις σε κάθε αλλαγή δεδομένων που αντιστοιχεί στη συνθήκη του ερωτήματος. Αυτό είναι βολικό για το UI που ενημερώνει αυτόματα τη λίστα κατά την προσθήκη ή αφαίρεση στοιχείων.
val query = taskBox.query()
.equal(Task_.isCompleted, false)
.orderDesc(Task_.priority)
.build()
query.subscribe { tasks ->
// tasks — List, ενημερώνεται αυτόματα
updateUi(tasks)
}
ObjectBox υποστηρίζει σχέσεις μεταξύ οντοτήτων — To-One, To-Many και Many-to-Many. Οι σχέσεις ορίζονται μέσω του σχολιασμού @Relation. Σε αντίθεση με την SQLite, το ObjectBox δεν χρησιμοποιεί ξένα κλειδιά: οι σχέσεις υλοποιούνται μέσω λιστών ID σε επίπεδα αρχεία, επιταχύνοντας την πλοήγηση στο γράφημα αντικειμένων.
Η σχέση @Backlink επιτρέπει τη μετάβαση από την παιδική οντότητα στη γονική χωρίς ξεχωριστό πεδίο αναφοράς. Το ObjectBox διατηρεί αυτόματα την αντίστροφη αναφορά, εξαλείφοντας τον διπλασιασμό δεδομένων και τον συγχρονισμό μεταξύ δύο πινάκων.
ObjectBox Query Builder επιτρέπει τη δημιουργία αλυσίδων συνθηκών: equal, notEqual, greater, less, in, contains, startsWith. Όλες οι συνθήκες συνδυάζονται μέσω and/or. Το αποτέλεσμα μπορεί να ταξινομηθεί, να περιοριστεί και να ληφθεί ως List ή LazyList (για μεγάλα σύνολα δεδομένων).
ObjectBox δημιουργεί αυτόματα ευρετήριο για το πεδίο @Id. Για προσαρμοσμένα ευρετήρια, χρησιμοποιήστε τον σχολιασμό @Index σε πεδία που αναζητούνται συχνά. Τα ευρετήρια επιταχύνουν τα ερωτήματα equal και in, αλλά επιβραδύνουν την εισαγωγή — μην δημιουργείτε ευρετήριο σε πεδία που δεν αναζητούνται. Το ObjectBox υποστηρίζει σύνθετα ευρετήρια για ταυτόχρονη φιλτράρισμα σε πολλά πεδία. Τα σύνθετα ευρετήρια είναι ιδιαίτερα χρήσιμα για φίλτρα σε λίστες: για παράδειγμα, η αναζήτηση ημιτελών εργασιών υψηλής προτεραιότητας εκτελείται δεκάδες φορές ταχύτερα με σύνθετο ευρετήριο στα πεδία isCompleted και priority.
ObjectBox Sync είναι μια ιδιόκτητη τεχνολογία για συγχρονισμό δεδομένων σε πραγματικό χρόνο μεταξύ συσκευών. Χρησιμοποιεί πρωτόκολλο βασισμένο σε WebSocket με επίλυση συγκρούσεων βάσει last-writer-wins. Το Sync είναι κατάλληλο για εφαρμογές που χρειάζονται συγχρονισμό εκτός σύνδεσης: σημειώσεις, λίστες εργασιών, δεδομένα IoT από πολλούς αισθητήρες. Ωστόσο, για παραγωγή απαιτείται αγορά άδειας χρήσης.
// Ερώτημα με πολλαπλές συνθήκες
val highPriorityIncomplete = taskBox.query()
.greater(Task_.priority, 5)
.equal(Task_.isCompleted, false)
.build()
.find()
// Αναζήτηση υποσυμβολοσειράς
val searchResults = taskBox.query()
.contains(Task_.title, "προϊόν", StringOrder.CASE_INSENSITIVE)
.build()
.find()
Συχνές Ερωτήσεις
ObjectBox διανέμεται υπό την άδεια Apache 2.0, η οποία επιτρέπει εμπορική χρήση χωρίς περιορισμούς. Η λειτουργία ObjectBox Sync (διαπλατφορμικός συγχρονισμός) είναι ιδιόκτητη και απαιτεί αγορά άδειας για παραγωγή.
BoxStore είναι ασφαλές για νήματα: πολλά νήματα μπορούν να διαβάζουν δεδομένα ταυτόχρονα. Η εγγραφή μπλοκάρεται σε επίπεδο Box. Για σύνθετες συναλλαγές χρησιμοποιήστε το boxStore.runInTx(), το οποίο εγγυάται την ατομικότητα μιας ομάδας λειτουργιών.
Ναι, το ObjectBox υποστηρίζει Kotlin Multiplatform (KMP) από την έκδοση 3.0. Διαθέσιμοι στόχοι: Android, iOS, JVM και Native. Για KMP χρησιμοποιείται ξεχωριστό πρόσθετο Gradle objectbox-kotlin με υποστήριξη expect/actual.
ObjectBox αποθηκεύει δεδομένα σε αρχεία .mdb στον κατάλογο της εφαρμογής. Για αντίγραφο ασφαλείας, αντιγράψτε ολόκληρο τον κατάλογο ObjectBox μέσω BoxStore.copy() ή χειροκίνητα μετά την κλήση boxStore.close(). Τα ζωντανά αρχεία δεν μπορούν να αντιγραφούν — αυτό θα καταστρέψει τα δεδομένα.
Room είναι ORM πάνω από SQLite, απαιτεί ερωτήματα SQL και έχει επιβάρυνση για αντιστοίχιση αντικειμένων. Το ObjectBox είναι NoSQL χωρίς SQL, πολύ ταχύτερο, αλλά δεν υποστηρίζει σύνθετα JOIN και δεν είναι σχεσιακή βάση δεδομένων. Η επιλογή εξαρτάται από την εργασία: για σχεσιακά δεδομένα — Room, για γρήγορη αποθήκευση αντικειμένων — ObjectBox.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης