Realm in mobiele apps: wat is het en hoe werkt het

Auteur: IT Sectr Gepubliceerd: 2026-03-12 Leestijd: 11 min

Realm is een mobiele objectgeoriënteerde NoSQL-database, ontwikkeld als alternatief voor SQLite en Core Data voor iOS en Android. Gegevens worden opgeslagen in een eigen formaat met directe toegang tot objecten in het geheugen, wat zorgt voor hoge lees- en schrijfsnelheden. Dankzij reactieve meldingen, automatische synchronisatie via Realm Sync en een cross-platform gegevensmodel wordt Realm gebruikt op meer dan 1 miljard apparaten (gegevens MongoDB, 2025).

Belangrijkste punten

  • Realm is een NoSQL objectdatabase voor mobiele platformen met directe toegang tot gegevens in het werkgeheugen.
  • Live Objects Realm-objecten worden automatisch bijgewerkt wanneer gegevens wijzigen, zonder handmatig herladen.
  • Zero-copy gegevens worden niet gekopieerd tussen applicatielagen, waardoor ORM-overhead wordt geëlimineerd.
  • Realm Sync ingebouwde synchronisatie tussen apparaten via MongoDB Atlas Device Sync.
  • Cross-platform het gegevensmodel wordt eenmalig gedefinieerd voor iOS, Android, Flutter en React Native.

Wat is Realm?

Realm is een objectgeoriënteerde database, speciaal gemaakt voor mobiele applicaties. In tegenstelling tot SQLite gebruikt Realm geen SQL en een relationeel model — gegevens worden opgeslagen als levende objecten (Live Objects), die direct toegankelijk zijn zonder een tussenliggende ORM-laag. De ontwikkelaar werkt met gewone taalobjecten (Swift, Kotlin, Dart), die automatisch in de database worden opgeslagen.

Realm verscheen in 2014 als startup Realm Inc. en werd in 2019 overgenomen door MongoDB Inc. Sindsdien wordt Realm ontwikkeld als MongoDB Realm — onderdeel van het uniforme Atlas Device Sync-platform voor mobiele gegevenssynchronisatie. De lokale Realm-database blijft gratis en open source (Apache 2.0-licentie), terwijl Realm Sync (cloudsynchronisatie) op abonnementsbasis wordt aangeboden.

Volgens het MongoDB Developer Report (2025) wordt Realm in 15% van de mobiele applicaties gebruikt als primaire lokale opslag. Belangrijkste scenario's zijn applicaties met een offlinemodus, complexe objectmodellen en behoefte aan synchronisatie tussen apparaten, waar Realm SQLite overtreft in ontwikkelsnelheid en gebruiksgemak van objecten.

Principes van Realm

Live Objects elk Realm-object is via een memory-mapped bestand aan de schijf gekoppeld. Een wijziging van een object in een thread wordt onmiddellijk weerspiegeld in alle andere threads zonder handmatige melding. De UI wordt automatisch opnieuw getekend bij gegevenswijzigingen via Realm-meldingen. Zero-copy Realm kopieert geen gegevens van de database naar objecten, objecten zijn de gegevens in het geheugen.

Hoe is Realm opgebouwd: architectuur en opslag

De kern van Realm is geschreven in C++ en gebruikt B+ Tree voor het indexeren van gegevens. In tegenstelling tot SQLite, waar elke rij een record in een relationele tabel is, slaat Realm objecten op als knooppunten in een grafstructuur met directe verwijzingen ertussen (forward pointers). Relaties tussen objecten zijn geen foreign keys, maar directe aanwijzers, wat de noodzaak voor JOIN-operaties elimineert.

Realm-bestanden (.realm-extensie) zijn memory-mapped het besturingssysteem beheert zelf het laden van bestandspagina's in het geheugen bij toegang. Hierdoor kan Realm werken met databases die groter zijn dan het beschikbare werkgeheugen en zorgt het voor leeslatentie op het niveau van native datastructuren van de taal (Swift Array of Kotlin List) voor gegevens die in RAM passen.

Zero-copy en Live Objects

Memory-mapped bestanden zijn de sleuteltechnologie van Realm. In plaats van gegevens uit het databasebestand naar taalobjecten te kopiëren (zoals SQLite doet via sqlite3_step + sqlite3_column_*), wijst Realm het databasebestand direct toe aan de adresruimte van het proces. Taalobjecten zijn slechts aanwijzers naar gegevens in het toegewezen geheugen. Het wijzigen van een object verandert de database op schijf zonder afzonderlijke save-aanroep.

KenmerkRealm (zero-copy)SQLite (kopiëren)
LezenDirecte geheugentoegang (nanoseconden)Kopiëren naar object (microseconden)
SchrijvenOnmiddellijk schrijven naar memory-mapped bestandsave() met SQL INSERT/UPDATE-transactie
RelatiesDirecte aanwijzers (forward pointers)Foreign key + JOIN
GeheugengebruikBestand + paginacache OSObjecten + paginacache SQLite
Live objectenJa (automatische update)Nee (nieuwe fetch vereist)

Het geheugengebruik van Realm is hoger bij actief lezen (het hele bestand of een groot deel ervan is toegewezen in het geheugen), maar lager bij schrijfbewerkingen, omdat er geen geheugen hoeft te worden toegewezen voor kopieën van objecten. Voor databases tot 1 GB op mobiele apparaten biedt de memory-mapped aanpak betere algemene prestaties dan SQLite met zijn tussentijdse kopiëren.

Realm vs SQLite vs Core Data: vergelijking

SQLite is een relationeel databasebeheersysteem met SQL en ACID-transacties. Realm is een objectgeoriënteerde NoSQL-database met memory-mapped toegang. Core Data is een Apple ORM-laag bovenop SQLite. Elk van de drie benaderingen heeft zijn eigen toepassingsgebied en sterke punten. Realm wint in snelheid van directe objecttoegang en reactiviteit, SQLite in universaliteit en volwassenheid, Core Data in integratie met het Apple-ecosysteem.

De prestaties van Realm bij leesbewerkingen zijn 10-50% hoger dan SQLite dankzij zero-copy toegang. Bij schrijfbewerkingen is Realm ook sneller door het ontbreken van SQL-syntaxisanalyse en directe wijziging van memory-mapped pagina's. Realm kan echter meer werkgeheugen verbruiken bij het werken met grote databases (>500 MB), omdat het bestand volledig in de adresruimte wordt toegewezen.

CriteriumRealmSQLiteCore Data
TypeNoSQL objectdatabaseRelationeel DBMS (SQL)ORM bovenop SQLite
LeessnelheidHoog (zero-copy)GemiddeldGemiddeld (ORM-overhead)
ReactiviteitLive Objects (ingebouwd)Wrapper nodig (Room/GRDB)NSFetchedResultsController
SynchronisatieRealm Sync (MongoDB Atlas)Aangepaste implementatie vereistNSPersistentCloudKitContainer
PlatformeniOS, Android, Flutter, RN, Node.jsiOS, Android, Web, DesktopAlleen iOS/macOS
Bibliotheekgrootte~4 MB~600 KBIngebouwd in SDK

De keuze tussen Realm en SQLite hangt vaak af van prioriteiten: ontwikkelingssnelheid en reactiviteit (Realm) versus controle en universaliteit (SQLite). Realm is vooral goed voor MVP's en prototypes, waar het gegevensmodel vaak verandert en het belangrijk is om snel live UI-updates te krijgen. SQLite/Room heeft de voorkeur voor volwassen producten met grote hoeveelheden gegevens en complexe analytische queries.

Realm op Android: Kotlin SDK

Realm Kotlin SDK is de officiële bibliotheek voor Android, geschreven in Kotlin (geen wrapper rond Java SDK). Het gegevensmodel wordt gedefinieerd via klassen die overerven van RealmObject, met de annotatie @PrimaryKey voor een unieke identificatie. Realm Kotlin ondersteunt Kotlin Coroutines, Flow en KSP (Kotlin Symbol Processing) voor compile-time codegeneratie.

RealmQuery biedt een type-safe API voor filteren zonder SQL. Query's worden opgebouwd via een methodenketen: queryfiltersortfind. Het resultaat kan worden geretourneerd als lijst (met laden in het geheugen) of als Flow (reactieve stream die wordt bijgewerkt bij gegevenswijzigingen). Realm Kotlin ondersteunt ook geneste objecten en lijsten (RealmList).

Voorbeeld Realm Kotlin SDK

Het gegevensmodel van Realm wordt gedefinieerd als een data class die de RealmObject-interface implementeert. Het veld _id is gemarkeerd met @PrimaryKey voor unieke identificatie. De relatie „��n-op-veel“ wordt geïmplementeerd via RealmList — een lijst van andere RealmObjecten. Alle schrijfbewerkingen (create, update, delete) worden uitgevoerd binnen een write-transactieblok.

kotlin
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()

Een Flow-retournerende query emitteert automatisch nieuwe resultaten bij elke gegevenswijziging in Realm: toevoegen, bijwerken of verwijderen van Project of Task. De Flow-benadering combineert ideaal met Compose: collectAsState() in ViewModel herstelt de UI automatisch bij gegevenswijzigingen zonder handmatige update van lijstadapter of gebruik van LiveData.

Realm op iOS: Swift SDK

Realm Swift SDK biedt een native Swift API met ondersteuning voor async/await, Combine Publishers en Swift Concurrency. Gegevensmodellen worden gedefinieerd als klassen die overerven van Object, met @Persisted voor eigenschappen. Realm Swift werkt objecten automatisch bij bij wijzigingen, en meldingen (NotificationToken) maken het mogelijk om te abonneren op wijzigingen van afzonderlijke objecten of collecties.

@ObservedRealmObject en @ObservedResults zijn Property Wrappers voor SwiftUI die de View automatisch opnieuw tekenen bij wijziging van Realm-gegevens. @ObservedResults werkt met queryresultaten, @ObservedRealmObject met een specifiek object. Beide eigenschappen annuleren het abonnement bij deinitialisatie van de View.

Voorbeeld Realm Swift SDK

SwiftUI-integratie van Realm is een van de sterke punten van de SDK. De Property Wrapper @ObservedResults koppelt een Realm-query aan de weergave in SwiftUI. Bij wijziging van een taak herstelt SwiftUI de lijst automatisch. realm.writeAsync voert transacties uit op de achtergrondthread zonder de UI te blokkeren.

swift
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("Taak toevoegen") {
            let realm = try! Realm()
            try! realm.write {
                realm.add(TaskItem(value: ["title": "New task"]))
            }
        }
    }
}

@ObservedResults beheert automatisch de levenscyclus van een Realm-query: bij het maken van een View wordt een abonnement op wijzigingen aangemaakt, bij vernietiging wordt het geannuleerd. De Property Wrapper accepteert een optioneel predicaat (NSPredicate) en sortering. Dit elimineert de noodzaak om handmatig fetch-query's te schrijven, een ViewModel te maken en te abonneren op Realm-meldingen.

Gebruiksscenario's voor Realm

Offline applicaties Realm is ideaal voor scenario's waar gegevens beschikbaar moeten zijn zonder internet. Ingebouwde synchronisatie (Realm Sync met MongoDB Atlas) lost automatisch conflicten op bij verbinding met het netwerk. De applicatie blijft werken met lokale gegevens en achtergrondsynchronisatie werkt deze bij wanneer er een verbinding is.

Reactieve interfaces Live Objects en Flow/Combine-meldingen maken Realm een handige keuze voor applicaties met vaak veranderende gegevens: chatberichten, takenfeeds, gedeelde documenten. De UI wordt automatisch bijgewerkt bij toevoegen, wijzigen of verwijderen van gegevens zonder handmatige aanroep van reloadData of invalidate.

Cross-platform projecten Realm ondersteunt Kotlin Multiplatform (KMP), Flutter, React Native en Xamarin. Het gegevensmodel wordt eenmalig gedefinieerd en op alle platformen gebruikt. Dit vermindert code-duplicatie en garandeert consistentie van het gegevensschema tussen iOS- en Android-applicaties met gemeenschappelijke bedrijfslogica.

Realm Sync: synchronisatie via MongoDB Atlas

Realm Sync is een cloudservice ingebouwd in MongoDB Atlas. De applicatie synchroniseert automatisch gegevens tussen de apparaten van de gebruiker en de server. Conflicten worden opgelost volgens de „last write wins“-strategie of via aangepaste Conflict Resolution Functions op de server. Realm Sync ondersteunt gedeeltelijke synchronisatie (subset of data) om het datagebruik te verminderen.

kotlin
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)
        // Automatische synchronisatie is actief
    }
}

SyncConfiguration configureert de verbinding met MongoDB Atlas en bepaalt de set te synchroniseren modellen. Na authenticatie van de gebruiker laadt Realm automatisch gegevens uit de cloud en voegt deze samen met lokale wijzigingen. Synchronisatie werkt op de achtergrondthread en vereist geen handmatige aanroep — het volstaat om een Realm-instantie met SyncConfiguration te maken.

Veelgestelde vragen

Is Realm gratis voor commercieel gebruik?

Ja, de lokale Realm-database is volledig gratis (Apache 2.0-licentie). Realm Sync (cloudsynchronisatie) via MongoDB Atlas is een betaalde service die onderdeel is van het Atlas Device Sync-abonnement. Voor het gratis niveau van Atlas zijn de eerste 500 MB aan gegevens en 1 miljoen bewerkingen per maand beschikbaar.

Kan ik migreren van SQLite naar Realm?

Ja, migratie is mogelijk door gegevens uit SQLite naar JSON te exporteren en bij de eerste start van de applicatie in Realm te importeren. Gebruik voor grote volumes streamingmigratie: schrijf gegevens parallel naar beide databases totdat gebruikers overstappen naar de nieuwe versie van de applicatie en verwijder vervolgens het SQLite-bestand.

Hoe lost Realm synchronisatieconflicten op?

Realm Sync gebruikt standaard de „last write wins“-strategie — de laatste schrijfbewerking overschrijft de vorige. Configureer voor complexe conflicten aangepaste Conflict Resolution Functions op de MongoDB Atlas-server die wijzigingen van verschillende apparaten samenvoegen op basis van de bedrijfslogica van de applicatie (bijvoorbeeld waarden samenvoegen in plaats van vervangen).

Ondersteunt Realm aggregatiequery's?

Realm ondersteunt geen SQL-aggregaties (SUM, AVG, GROUP BY) op databaseniveau. Voor analytische query's wordt aanbevolen gegevens uit Realm naar MongoDB Atlas te exporteren via Realm Sync en aggregaties uit te voeren via de MongoDB Aggregation Pipeline. Gebruik voor eenvoudige tellingen realm.query<T>().count().

Zijn gegevens in Realm veilig?

Realm versleutelt gegevens standaard niet. Geef voor versleuteling een 64-byte sleutel op in de configuratie: Realm.Configuration(encryptionKey: key). Versleuteling gebruikt AES-256 + SHA-2 HMAC en verhoogt de overhead op bewerkingen met 10-20%. Zonder versleuteling kan het .realm-bestand worden gelezen door elk proces met toegang tot het bestandssysteem.

Samenvatting

  • Realm is een objectgeoriënteerde NoSQL-database met memory-mapped toegang, live objects en een cross-platform gegevensmodel voor mobiele applicaties.
  • Zero-copy architectuur maakt het mogelijk om gegevens direct uit het memory-mapped bestand te lezen zonder kopiëren naar taalobjecten, waardoor Realm 10-50% sneller is dan SQLite bij lezen.
  • Live Objects en @ObservedResults (SwiftUI) / Flow (Kotlin) zorgen voor automatische UI-updates bij gegevenswijzigingen zonder handmatige databasequery's.
  • Realm Sync met MongoDB Atlas biedt ingebouwde cloudsynchronisatie met conflictoplossing volgens de „last write wins“-strategie.
  • Cross-platform SDK's ondersteunen Kotlin Multiplatform, Flutter, React Native — het gegevensmodel wordt eenmalig gedefinieerd voor alle platformen.
  • Voor analytische query's is Realm zwakker dan SQLite vanwege het ontbreken van groepsaggregaties — complexe rapporten worden uitgevoerd via de MongoDB Aggregation Pipeline.
  • Aanbeveling gebruik Realm voor offline applicaties met frequente UI-updates en behoefte aan cross-platform synchronisatie, SQLite/Room voor projecten met analyse en stabiele gegevenssets.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook