Το Realm είναι μια κινητή αντικειμενοστραφής NoSQL βάση δεδομένων, που αναπτύχθηκε ως εναλλακτική λύση για SQLite και Core Data σε iOS και Android. Τα δεδομένα αποθηκεύονται σε ιδιόκτητη μορφή με άμεση πρόσβαση σε αντικείμενα στη μνήμη, εξασφαλίζοντας υψηλή ταχύτητα ανάγνωσης και εγγραφής. Χάρη στις αντιδραστικές ειδοποιήσεις, τον αυτόματο συγχρονισμό μέσω Realm Sync και το cross-platform μοντέλο δεδομένων, το Realm χρησιμοποιείται σε περισσότερες από 1 δισεκατομμύριο συσκευές (δεδομένα MongoDB, 2025).
Βασικά Σημεία
Realm είναι μια αντικειμενοστραφής βάση δεδομένων που δημιουργήθηκε ειδικά για εφαρμογές κινητών. Σε αντίθεση με την SQLite, το Realm δεν χρησιμοποιεί SQL και σχεσιακό μοντέλο — τα δεδομένα αποθηκεύονται ως ζωντανά αντικείμενα (Live Objects) στα οποία η πρόσβαση γίνεται άμεσα, χωρίς ενδιάμεσο επίπεδο ORM. Ο προγραμματιστής εργάζεται με συνηθισμένα αντικείμενα γλώσσας (Swift, Kotlin, Dart) που αποθηκεύονται αυτόματα στη βάση δεδομένων.
Το Realm εμφανίστηκε το 2014 ως startup Realm Inc., και το 2019 εξαγοράστηκε από τη MongoDB Inc. Από τότε, το Realm αναπτύσσεται ως MongoDB Realm — μέρος της ενοποιημένης πλατφόρμας Atlas Device Sync για συγχρονισμό δεδομένων κινητών. Η τοπική βάση δεδομένων Realm παραμένει δωρεάν και ανοιχτού κώδικα (άδεια Apache 2.0), ενώ το Realm Sync (συγχρονισμός cloud) διατίθεται μέσω συνδρομής.
Σύμφωνα με την αναφορά MongoDB Developer Report (2025), το Realm χρησιμοποιείται στο 15% των εφαρμογών κινητών ως κύρια τοπική αποθήκευση. Τα κύρια σενάρια είναι εφαρμογές με λειτουργία εκτός σύνδεσης, πολύπλοκα αντικειμενοστραφή μοντέλα και ανάγκη συγχρονισμού μεταξύ συσκευών, όπου το Realm υπερτερεί της SQLite σε ταχύτητα ανάπτυξης και ευκολία εργασίας με αντικείμενα.
Live Objects κάθε αντικείμενο Realm είναι συνδεδεμένο με το δίσκο μέσω memory-mapped αρχείου. Η αλλαγή ενός αντικειμένου σε οποιοδήποτε νήμα αντικατοπτρίζεται αμέσως σε όλα τα άλλα νήματα χωρίς χειροκίνητη ειδοποίηση. Η διεπαφή χρήστη ανασχεδιάζεται αυτόματα όταν αλλάζουν τα δεδομένα μέσω ειδοποιήσεων Realm. Zero-copy το Realm δεν αντιγράφει δεδομένα από τη βάση δεδομένων σε αντικείμενα, τα αντικείμενα είναι τα ίδια τα δεδομένα στη μνήμη.
Ο πυρήνας του Realm είναι γραμμένος σε C++ και χρησιμοποιεί B+ Tree για την ευρετηρίαση δεδομένων. Σε αντίθεση με την SQLite, όπου κάθε γραμμή είναι μια εγγραφή σε έναν σχεσιακό πίνακα, το Realm αποθηκεύει αντικείμενα ως κόμβους σε μια δομή γραφήματος με άμεσες αναφορές μεταξύ τους (forward pointers). Οι σχέσεις μεταξύ αντικειμένων δεν είναι foreign keys, αλλά άμεσοι δείκτες, εξαλείφοντας την ανάγκη για λειτουργίες JOIN.
Τα αρχεία Realm (επέκταση .realm) είναι memory-mapped — το λειτουργικό σύστημα διαχειρίζεται το ίδιο τη φόρτωση σελίδων του αρχείου στη μνήμη κατά την πρόσβαση. Αυτό επιτρέπει στο Realm να λειτουργεί με βάσεις δεδομένων που υπερβαίνουν τη διαθέσιμη μνήμη RAM και εξασφαλίζει καθυστέρηση ανάγνωσης στο επίπεδο των εγγενών δομών δεδομένων της γλώσσας (Swift Array ή Kotlin List) για δεδομένα που χωρούν στη RAM.
Memory-mapped αρχεία είναι η βασική τεχνολογία του Realm. Αντί να αντιγράφει δεδομένα από το αρχείο βάσης δεδομένων σε αντικείμενα γλώσσας (όπως κάνει η SQLite μέσω sqlite3_step + sqlite3_column_*), το Realm αντιστοιχίζει το αρχείο βάσης δεδομένων απευθείας στο χώρο διευθύνσεων της διεργασίας. Τα αντικείμενα γλώσσας είναι απλώς δείκτες σε δεδομένα στην αντιστοιχισμένη μνήμη. Η αλλαγή ενός αντικειμένου αλλάζει τη βάση δεδομένων στο δίσκο χωρίς ξεχωριστή κλήση save.
| Χαρακτηριστικό | Realm (zero-copy) | SQLite (αντιγραφή) |
|---|---|---|
| Ανάγνωση | Άμεση πρόσβαση στη μνήμη (νανοδευτερόλεπτα) | Αντιγραφή σε αντικείμενο (μικροδευτερόλεπτα) |
| Εγγραφή | Άμεση εγγραφή σε memory-mapped αρχείο | save() με συναλλαγή SQL INSERT/UPDATE |
| Σχέσεις | Άμεσοι δείκτες (forward pointers) | Foreign key + JOIN |
| Κατανάλωση μνήμης | Αρχείο + προσωρινή μνήμη σελίδων OS | Αντικείμενα + προσωρινή μνήμη σελίδων SQLite |
| Ζωντανά αντικείμενα | Ναι (αυτόματη ενημέρωση) | Όχι (απαιτείται νέο fetch) |
Η κατανάλωση μνήμης του Realm είναι υψηλότερη κατά την ενεργή ανάγνωση (ολόκληρο το αρχείο ή μεγάλο μέρος του είναι αντιστοιχισμένο στη μνήμη), αλλά χαμηλότερη κατά τις λειτουργίες εγγραφής, καθώς δεν απαιτείται κατανομή μνήμης για αντίγραφα αντικειμένων. Για βάσεις δεδομένων έως 1 GB σε κινητές συσκευές, η προσέγγιση memory-mapped παρέχει καλύτερη συνολική απόδοση από την SQLite με την ενδιάμεση αντιγραφή της.
SQLite είναι ένα σχεσιακό σύστημα διαχείρισης βάσεων δεδομένων με SQL και συναλλαγές ACID. Το Realm είναι μια αντικειμενοστραφής NoSQL βάση δεδομένων με πρόσβαση memory-mapped. Το Core Data είναι ένα επίπεδο ORM της Apple πάνω από την SQLite. Κάθε μία από τις τρεις προσεγγίσεις έχει τον δικό της τομέα εφαρμογής και δυνατά σημεία. Το Realm υπερέχει σε ταχύτητα άμεσης πρόσβασης σε αντικείμενα και αντιδραστικότητα, η SQLite σε καθολικότητα και ωριμότητα, το Core Data σε ενσωμάτωση με το οικοσύστημα Apple.
Η απόδοση του Realm σε λειτουργίες ανάγνωσης είναι 10-50% υψηλότερη από την SQLite χάρη στην πρόσβαση zero-copy. Σε λειτουργίες εγγραφής, το Realm είναι επίσης ταχύτερο λόγω της απουσίας συντακτικής ανάλυσης SQL και της άμεσης τροποποίησης σελίδων memory-mapped. Ωστόσο, το Realm μπορεί να καταναλώνει περισσότερη μνήμη RAM όταν εργάζεται με μεγάλες βάσεις δεδομένων (>500 MB), καθώς το αρχείο αντιστοιχίζεται πλήρως στο χώρο διευθύνσεων.
| Κριτήριο | Realm | SQLite | Core Data |
|---|---|---|---|
| Τύπος | NoSQL αντικειμενοστραφής ΒΔ | Σχεσιακό DBMS (SQL) | ORM πάνω από SQLite |
| Ταχύτητα ανάγνωσης | Υψηλή (zero-copy) | Μεσαία | Μεσαία (επιβάρυνση ORM) |
| Αντιδραστικότητα | Live Objects (ενσωματωμένη) | Χρειάζεται wrapper (Room/GRDB) | NSFetchedResultsController |
| Συγχρονισμός | Realm Sync (MongoDB Atlas) | Απαιτείται προσαρμοσμένη υλοποίηση | NSPersistentCloudKitContainer |
| Πλατφόρμες | iOS, Android, Flutter, RN, Node.js | iOS, Android, Web, Desktop | Μόνο iOS/macOS |
| Μέγεθος βιβλιοθήκης | ~4 MB | ~600 KB | Ενσωματωμένο στο SDK |
Η επιλογή μεταξύ Realm και SQLite συχνά εξαρτάται από προτεραιότητες: ταχύτητα ανάπτυξης και αντιδραστικότητα (Realm) έναντι ελέγχου και καθολικότητας (SQLite). Το Realm είναι ιδιαίτερα καλό για MVP και πρωτότυπα, όπου το μοντέλο δεδομένων αλλάζει συχνά και είναι σημαντικό να λαμβάνονται γρήγορα ζωντανές ενημερώσεις UI. Η SQLite/Room προτιμάται για ώριμα προϊόντα με μεγάλους όγκους δεδομένων και σύνθετα αναλυτικά ερωτήματα.
Realm Kotlin SDK είναι η επίσημη βιβλιοθήκη για Android, γραμμένη σε Kotlin (όχι wrapper πάνω από Java SDK). Το μοντέλο δεδομένων ορίζεται μέσω κλάσεων που κληρονομούν από RealmObject, με σχολιασμό @PrimaryKey για μοναδικό αναγνωριστικό. Το Realm Kotlin υποστηρίζει Kotlin Coroutines, Flow και KSP (Kotlin Symbol Processing) για δημιουργία κώδικα κατά τη μεταγλώττιση.
RealmQuery παρέχει type-safe API για φιλτράρισμα χωρίς SQL. Τα ερωτήματα δημιουργούνται με αλυσίδα μεθόδων: query → filter → sort → find. Το αποτέλεσμα μπορεί να επιστραφεί ως λίστα (με φόρτωση στη μνήμη) ή ως Flow (αντιδραστική ροή που ενημερώνεται όταν αλλάζουν τα δεδομένα). Το Realm Kotlin υποστηρίζει επίσης ένθετα αντικείμενα και λίστες (RealmList).
Το μοντέλο δεδομένων του Realm ορίζεται ως data class που υλοποιεί τη διεπαφή RealmObject. Το πεδίο _id είναι σημειωμένο με @PrimaryKey για μοναδική αναγνώριση. Η σχέση “ένα-προς-πολλά” υλοποιείται μέσω RealmList — μιας λίστας άλλων RealmObject. Όλες οι λειτουργίες εγγραφής (create, update, delete) εκτελούνται εντός του μπλοκ συναλλαγής write.
class Project : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId().generate()
var name: String = ""
var tasks: RealmList<Task> = realmListOf()
}
class Task : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId().generate()
var title: String = ""
var isComplete: Boolean = false
}
val config = Realm.Configuration.Builder(
schema = setOf(Project::class, Task::class)
).build()
val realm = Realm.open(config)
realm.write { transactionRealm ->
val project = copyToRealm(Project().apply {
name = "Mobile App"
})
project.tasks.add(copyToRealm(Task().apply {
title = "Design UI"
}))
}
val projects: Flow<RealmResults<Project>> =
realm.query<Project>()
.sort(Project::name, Sort.ASCENDING)
.asFlow()
Ένα ερώτημα που επιστρέφει Flow εκπέμπει αυτόματα νέα αποτελέσματα σε κάθε αλλαγή δεδομένων στο Realm: προσθήκη, ενημέρωση ή διαγραφή Project ή Task. Η προσέγγιση Flow συνδυάζεται ιδανικά με το Compose: το collectAsState() στο ViewModel ανασυνθέτει αυτόματα το UI όταν αλλάζουν τα δεδομένα, χωρίς χειροκίνητη ενημέρωση προσαρμογέων λίστας ή χρήση LiveData.
Realm Swift SDK παρέχει εγγενές Swift API με υποστήριξη για async/await, Combine Publishers και Swift Concurrency. Τα μοντέλα δεδομένων ορίζονται ως κλάσεις που κληρονομούν από Object, με χρήση @Persisted για ιδιότητες. Το Realm Swift ενημερώνει αυτόματα τα αντικείμενα κατά τις αλλαγές, και οι ειδοποιήσεις (NotificationToken) επιτρέπουν εγγραφή σε αλλαγές μεμονωμένων αντικειμένων ή συλλογών.
@ObservedRealmObject και @ObservedResults είναι Property Wrappers για SwiftUI που ανασχεδιάζουν αυτόματα το View όταν αλλάζουν τα δεδομένα Realm. Το @ObservedResults λειτουργεί με αποτελέσματα ερωτημάτων, το @ObservedRealmObject με συγκεκριμένο αντικείμενο. Και οι δύο ιδιότητες ακυρώνουν την εγγραφή κατά την αποαρχικοποίηση του View.
Η ενσωμάτωση SwiftUI του Realm είναι ένα από τα δυνατά σημεία του SDK. Ο Property Wrapper @ObservedResults συνδέει ένα ερώτημα Realm με την εμφάνιση στο SwiftUI. Κατά την αλλαγή οποιασδήποτε εργασίας, το SwiftUI ανασυνθέτει αυτόματα τη λίστα. Το realm.writeAsync εκτελεί συναλλαγές στο νήμα παρασκηνίου χωρίς αποκλεισμό του UI.
import RealmSwift
class TaskItem: Object, Identifiable {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var title: String = ""
@Persisted var isDone: Bool = false
@Persisted var priority: Int = 0
}
struct TaskListView: View {
@ObservedResults(TaskItem.self,
sortDescriptor: SortDescriptor(["priority"]))
var tasks
var body: some View {
List {
ForEach(tasks) { task in
TaskRow(task: task)
}
}
Button("Προσθήκη Εργασίας") {
let realm = try! Realm()
try! realm.write {
realm.add(TaskItem(value: ["title": "New task"]))
}
}
}
}
@ObservedResults διαχειρίζεται αυτόματα τον κύκλο ζωής ενός ερωτήματος Realm: κατά τη δημιουργία του View, δημιουργείται μια εγγραφή στις αλλαγές, κατά την καταστροφή ακυρώνεται. Ο Property Wrapper δέχεται ένα προαιρετικό κατηγόρημα (NSPredicate) και ταξινόμηση. Αυτό εξαλείφει την ανάγκη για χειροκίνητη σύνταξη ερωτημάτων fetch, δημιουργία ViewModel και εγγραφή σε ειδοποιήσεις Realm.
Εφαρμογές εκτός σύνδεσης Το Realm είναι ιδανικό για σενάρια όπου τα δεδομένα πρέπει να είναι διαθέσιμα χωρίς διαδίκτυο. Ο ενσωματωμένος συγχρονισμός (Realm Sync με MongoDB Atlas) επιλύει αυτόματα διενέξεις κατά τη σύνδεση στο δίκτυο. Η εφαρμογή συνεχίζει να λειτουργεί με τοπικά δεδομένα και ο συγχρονισμός παρασκηνίου τα ενημερώνει όταν υπάρχει σύνδεση.
Αντιδραστικές διεπαφές Τα Live Objects και οι ειδοποιήσεις Flow/Combine καθιστούν το Realm βολική επιλογή για εφαρμογές με συχνά μεταβαλλόμενα δεδομένα: συνομιλίες, ροές εργασιών, κοινόχρηστα έγγραφα. Το UI ενημερώνεται αυτόματα κατά την προσθήκη, τροποποίηση ή διαγραφή δεδομένων χωρίς χειροκίνητη κλήση reloadData ή invalidate.
Cross-platform έργα Το Realm υποστηρίζει Kotlin Multiplatform (KMP), Flutter, React Native και Xamarin. Το μοντέλο δεδομένων ορίζεται μία φορά και χρησιμοποιείται σε όλες τις πλατφόρμες. Αυτό μειώνει την επανάληψη κώδικα και εγγυάται τη συνέπεια του σχήματος δεδομένων μεταξύ εφαρμογών iOS και Android με κοινή επιχειρηματική λογική.
Realm Sync είναι μια υπηρεσία cloud ενσωματωμένη στο MongoDB Atlas. Η εφαρμογή συγχρονίζει αυτόματα δεδομένα μεταξύ των συσκευών του χρήστη και του διακομιστή. Οι διενέξεις επιλύονται σύμφωνα με τη στρατηγική “last write wins” ή μέσω προσαρμοσμένων συναρτήσεων Conflict Resolution στον διακομιστή. Το Realm Sync υποστηρίζει μερικό συγχρονισμό (υποσύνολο δεδομένων) για μείωση της κίνησης.
class SyncRepository {
private val app = App(
AppConfiguration(
appId = "my-realm-app-id"
)
)
suspend fun syncData() {
val user = app.login(Credentials.anonymous())
val config = SyncConfiguration.Builder(
user, setOf(Project::class)
).build()
val syncedRealm = Realm.open(config)
// Ο αυτόματος συγχρονισμός είναι ενεργός
}
}
SyncConfiguration ρυθμίζει τη σύνδεση με το MongoDB Atlas και καθορίζει το σύνολο των μοντέλων προς συγχρονισμό. Μετά την ταυτοποίηση του χρήστη, το Realm φορτώνει αυτόματα δεδομένα από το cloud και τα συγχωνεύει με τοπικές αλλαγές. Ο συγχρονισμός λειτουργεί στο νήμα παρασκηνίου και δεν απαιτεί χειροκίνητη κλήση — αρκεί η δημιουργία μιας παρουσίας Realm με SyncConfiguration.
Συχνές Ερωτήσεις
Ναι, η τοπική Realm βάση δεδομένων είναι εντελώς δωρεάν (άδεια Apache 2.0). Το Realm Sync (συγχρονισμός cloud) μέσω MongoDB Atlas είναι μια πληρωμένη υπηρεσία που περιλαμβάνεται στη συνδρομή Atlas Device Sync. Για το δωρεάν επίπεδο του Atlas, είναι διαθέσιμα τα πρώτα 500 MB δεδομένων και 1 εκατομμύριο λειτουργίες ανά μήνα.
Ναι, η μετανάστευση είναι δυνατή μέσω εξαγωγής δεδομένων από SQLite σε JSON και εισαγωγής στο Realm κατά την πρώτη φόρτωση της εφαρμογής. Για μεγάλους όγκους, χρησιμοποιήστε streaming migration: γράφετε δεδομένα παράλληλα και στις δύο βάσεις δεδομένων μέχρι οι χρήστες να μεταβούν στη νέα έκδοση της εφαρμογής και στη συνέχεια διαγράφετε το αρχείο SQLite.
Realm Sync χρησιμοποιεί προεπιλεγμένα τη στρατηγική “last write wins” — η τελευταία εγγραφή αντικαθιστά την προηγούμενη. Για σύνθετες διενέξεις, ρυθμίστε προσαρμοσμένες συναρτήσεις Conflict Resolution στον διακομιστή MongoDB Atlas που συγχωνεύουν αλλαγές από διαφορετικές συσκευές βάσει της επιχειρηματικής λογικής της εφαρμογής (π.χ. συγχώνευση τιμών αντί αντικατάστασης).
Realm δεν υποστηρίζει SQL συγκεντρώσεις (SUM, AVG, GROUP BY) σε επίπεδο βάσης δεδομένων. Για αναλυτικά ερωτήματα, συνιστάται η εξαγωγή δεδομένων από το Realm στο MongoDB Atlas μέσω Realm Sync και η εκτέλεση συγκεντρώσεων μέσω MongoDB Aggregation Pipeline. Για απλούς υπολογισμούς, χρησιμοποιήστε realm.query<T>().count().
Realm δεν κρυπτογραφεί δεδομένα από προεπιλογή. Για κρυπτογράφηση, καθορίστε ένα κλειδί 64-byte στη διαμόρφωση: Realm.Configuration(encryptionKey: key). Η κρυπτογράφηση χρησιμοποιεί AES-256 + SHA-2 HMAC και αυξάνει την επιβάρυνση των λειτουργιών κατά 10-20%. Χωρίς κρυπτογράφηση, το αρχείο .realm μπορεί να διαβαστεί από οποιαδήποτε διεργασία με πρόσβαση στο σύστημα αρχείων.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης