Realm i mobilappar: vad det är och hur det fungerar

Författare: IT Sectr Publicerad: 2026-03-12 Lästid: 11 min

Realm är en mobil objektorienterad NoSQL-databas som utvecklats som ett alternativ till SQLite och Core Data för iOS och Android. Data lagras i eget format med direkt åtkomst till objekt i minnet, vilket säkerställer hög läs- och skrivhastighet. Tack vare reaktiva notifieringar, automatisk synkronisering via Realm Sync och en cross-plattformsdatamodell används Realm på över 1 miljard enheter (MongoDB-data, 2025).

Huvudpunkter

  • Realm är en NoSQL objektdatabas för mobila plattformar med direkt åtkomst till data i arbetsminnet.
  • Live Objects Realm-objekt uppdateras automatiskt när data ändras utan manuell omladdning.
  • Zero-copy data kopieras inte mellan applikationslager, vilket eliminerar ORM-overhead.
  • Realm Sync inbyggd synkronisering mellan enheter via MongoDB Atlas Device Sync.
  • Cross-plattform datamodellen definieras en gång för iOS, Android, Flutter och React Native.

Vad är Realm?

Realm är en objektorienterad databas som skapats specifikt för mobilapplikationer. Till skillnad från SQLite använder Realm inte SQL och relationsmodell — data lagras som levande objekt (Live Objects) som är direkt tillgängliga utan ett mellanliggande ORM-lager. Utvecklaren arbetar med vanliga språkobjekt (Swift, Kotlin, Dart) som automatiskt sparas i databasen.

Realm dök upp 2014 som startupen Realm Inc. och förvärvades 2019 av MongoDB Inc. Sedan dess utvecklas Realm som MongoDB Realm — en del av den enhetliga Atlas Device Sync-plattformen för mobil datasynkronisering. Den lokala Realm-databasen förblir gratis och öppen (Apache 2.0-licens), medan Realm Sync (molnbaserad synkronisering) distribueras via prenumeration.

Enligt MongoDB Developer Report (2025) används Realm i 15% av mobilapplikationerna som primär lokal lagring. Huvudscenarierna är applikationer med offlineläge, komplexa objektmodeller och behov av synkronisering mellan enheter, där Realm överträffar SQLite i utvecklingshastighet och användarvänlighet vid arbete med objekt.

Principer för Realm

Live Objects varje Realm-objekt är kopplat till disken via en memory-mapped fil. Ändring av ett objekt i någon tråd reflekteras omedelbart i alla andra trådar utan manuell notifiering. Användargränssnittet ritas automatiskt om när data ändras via Realm-notifieringar. Zero-copy Realm kopierar inte data från databasen till objekt, objekten är själva data i minnet.

Hur Realm är uppbyggt: arkitektur och lagring

Realm-kärnan är skriven i C++ och använder B+ Tree för indexering av data. Till skillnad från SQLite, där varje rad är en post i en relationell tabell, lagrar Realm objekt som noder i en grafstruktur med direktreferenser mellan dem (forward pointers). Relationer mellan objekt är inte foreign keys utan direktpekare, vilket eliminerar behovet av JOIN-operationer.

Realm-filer (.realm-tillägg) är memory-mapped — operativsystemet hanterar själv inladdning av filsidor i minnet vid åtkomst. Detta gör att Realm kan arbeta med databaser som överstiger tillgängligt RAM och säkerställer läsfördröjning på nivån av språkets inbyggda datastrukturer (Swift Array eller Kotlin List) för data som ryms i RAM.

Zero-copy och Live Objects

Memory-mapped filer är nyckeltekniken i Realm. Istället för att kopiera data från databasfilen till språkobjekt (som SQLite gör via sqlite3_step + sqlite3_column_*), mappar Realm databasfilen direkt till processens adressutrymme. Språkobjekt är bara pekare till data i det mappade minnet. Ändring av ett objekt ändrar databasen på disken utan separat save-anrop.

EgenskapRealm (zero-copy)SQLite (kopiering)
LäsningDirekt minnesåtkomst (nanosekunder)Kopiering till objekt (mikrosekunder)
SkrivningOmedelbar skrivning till memory-mapped filsave() med SQL INSERT/UPDATE-transaktion
RelationerDirektpekare (forward pointers)Foreign key + JOIN
MinnesförbrukningFil + OS-sidcacheObjekt + SQLite-sidcache
Levande objektJa (automatisk uppdatering)Nej (ny fetch krävs)

Minnesförbrukningen för Realm är högre vid aktiv läsning (hela filen eller stor del av den är mappad i minnet), men lägre vid skrivoperationer eftersom ingen minnesallokering krävs för objektkopior. För databaser upp till 1 GB på mobila enheter ger memory-mapped-metoden bättre total prestanda än SQLite med dess mellanliggande kopiering.

Realm vs SQLite vs Core Data: jämförelse

SQLite är ett relationsdatabashanteringssystem med SQL och ACID-transaktioner. Realm är en objektorienterad NoSQL-databas med memory-mapped åtkomst. Core Data är ett Apple ORM-lager ovanpå SQLite. Var och en av de tre metoderna har sitt tillämpningsområde och styrkor. Realm vinner i hastighet för direkt objektåtkomst och reaktivitet, SQLite i universalitet och mognad, Core Data i integration med Apple-ekosystemet.

Realms prestanda vid läsoperationer är 10-50% högre än SQLite tack vare zero-copy-åtkomst. Vid skrivoperationer är Realm också snabbare på grund av avsaknad av SQL-syntaxanalys och direkt ändring av memory-mapped-sidor. Dock kan Realm förbruka mer RAM vid arbete med stora databaser (>500 MB), eftersom filen mappas helt till adressutrymmet.

KriteriumRealmSQLiteCore Data
TypNoSQL objektdatabasRelations-DBMS (SQL)ORM ovanpå SQLite
LäshastighetHög (zero-copy)MedelMedel (ORM-overhead)
ReaktivitetLive Objects (inbyggd)Wrapper behövs (Room/GRDB)NSFetchedResultsController
SynkroniseringRealm Sync (MongoDB Atlas)Anpassad implementering krävsNSPersistentCloudKitContainer
PlattformariOS, Android, Flutter, RN, Node.jsiOS, Android, Web, DesktopEndast iOS/macOS
Biblioteksstorlek~4 MB~600 KBInbyggt i SDK

Valet mellan Realm och SQLite handlar ofta om prioriteringar: utvecklingshastighet och reaktivitet (Realm) kontroll och universalitet (SQLite). Realm är särskilt bra för MVP och prototyper, där datamodellen ändras ofta och det är viktigt att snabbt få levande UI-uppdateringar. SQLite/Room föredras för mogna produkter med stora datavolymer och komplexa analytiska frågor.

Realm på Android: Kotlin SDK

Realm Kotlin SDK är det officiella biblioteket för Android, skrivet i Kotlin (inte ett wrapper över Java SDK). Datamodellen definieras via klasser som ärver från RealmObject, med annoteringen @PrimaryKey för unik identifiering. Realm Kotlin stöder Kotlin Coroutines, Flow och KSP (Kotlin Symbol Processing) för kompileringstidsgenerering av kod.

RealmQuery tillhandahåller ett type-safe API för filtrering utan SQL. Frågor byggs med metodkedja: queryfiltersortfind. Resultatet kan returneras som lista (med inladdning i minnet) eller som Flow (reaktiv ström som uppdateras vid dataändringar). Realm Kotlin stöder också nästlade objekt och listor (RealmList).

Exempel Realm Kotlin SDK

Datamodellen för Realm definieras som en data-klass som implementerar RealmObject-gränssnittet. Fältet _id är markerat med @PrimaryKey för unik identifiering. Relationen ”en-till-många” implementeras via RealmList — en lista av andra RealmObject. Alla skrivoperationer (create, update, delete) utförs inom ett write-transaktionsblock.

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

En Flow-returnerande fråga emitterar automatiskt nya resultat vid varje dataändring i Realm: tillägg, uppdatering eller borttagning av Project eller Task. Flow-metoden kombineras idealiskt med Compose: collectAsState() i ViewModel återsammanställer automatiskt UI vid dataändringar utan manuell uppdatering av listadaptrar eller användning av LiveData.

Realm på iOS: Swift SDK

Realm Swift SDK tillhandahåller ett native Swift API med stöd för async/await, Combine Publishers och Swift Concurrency. Datamodeller definieras som klasser som ärver från Object, med @Persisted för egenskaper. Realm Swift uppdaterar automatiskt objekt vid ändringar, och notifieringar (NotificationToken) möjliggör prenumeration på ändringar av enskilda objekt eller samlingar.

@ObservedRealmObject och @ObservedResults är Property Wrappers för SwiftUI som automatiskt ritar om View när Realm-data ändras. @ObservedResults arbetar med frågeresultat, @ObservedRealmObject med ett specifikt objekt. Båda egenskaperna avslutar prenumerationen vid deinitiering av View.

Exempel Realm Swift SDK

SwiftUI-integration för Realm är en av SDK:s styrkor. Property Wrapper @ObservedResults kopplar en Realm-fråga till visningen i SwiftUI. Vid ändring av en uppgift återsammanställer SwiftUI automatiskt listan. realm.writeAsync utför transaktioner på bakgrundstråden utan att blockera UI.

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("Lägg till uppgift") {
            let realm = try! Realm()
            try! realm.write {
                realm.add(TaskItem(value: ["title": "New task"]))
            }
        }
    }
}

@ObservedResults hanterar automatiskt livscykeln för en Realm-fråga: när View skapas skapas en prenumeration på ändringar, vid förstörelse avslutas den. Property Wrapper accepterar ett valfritt predikat (NSPredicate) och sortering. Detta eliminerar behovet av att manuellt skriva fetch-frågor, skapa ViewModel och prenumerera på Realm-notifieringar.

Användningsscenarier för Realm

Offline-applikationer Realm är idealiskt för scenarier där data måste vara tillgänglig utan internet. Inbyggd synkronisering (Realm Sync med MongoDB Atlas) löser automatiskt konflikter vid anslutning till nätverket. Applikationen fortsätter att arbeta med lokal data och bakgrundssynkronisering uppdaterar den när anslutning finns.

Reaktiva gränssnitt Live Objects och Flow/Combine-notifieringar gör Realm till ett bekvämt val för applikationer med ofta föränderlig data: chattar, uppgiftsflöden, delade dokument. UI uppdateras automatiskt vid tillägg, ändring eller borttagning av data utan manuella anrop till reloadData eller invalidate.

Cross-plattformsprojekt Realm stöder Kotlin Multiplatform (KMP), Flutter, React Native och Xamarin. Datamodellen definieras en gång och används på alla plattformar. Detta minskar kodduplicering och garanterar konsistens i dataschemat mellan iOS- och Android-applikationer med gemensam affärslogik.

Realm Sync: synkronisering via MongoDB Atlas

Realm Sync är en molntjänst inbyggd i MongoDB Atlas. Applikationen synkroniserar automatiskt data mellan användarens enheter och servern. Konflikter löses enligt strategin „last write wins” eller via anpassade Conflict Resolution Functions på servern. Realm Sync stöder partiell synkronisering (delmängd av data) för att minska trafik.

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)
        // Automatisk synkronisering är aktiv
    }
}

SyncConfiguration konfigurerar anslutningen till MongoDB Atlas och bestämmer vilka modeller som ska synkroniseras. Efter användarautentisering laddar Realm automatiskt data från molnet och slår samman dem med lokala ändringar. Synkronisering fungerar på bakgrundstråden och kräver inget manuellt anrop — det räcker att skapa en Realm-instans med SyncConfiguration.

Vanliga frågor

Är Realm gratis för kommersiellt bruk?

Ja, den lokala Realm-databasen är helt gratis (Apache 2.0-licens). Realm Sync (molnbaserad synkronisering) via MongoDB Atlas är en betaltjänst som ingår i Atlas Device Sync-prenumerationen. För den kostnadsfria nivån av Atlas finns de första 500 MB data och 1 miljon operationer per månad tillgängliga.

Kan man migrera från SQLite till Realm?

Ja, migrering är möjlig genom att exportera data från SQLite till JSON och importera till Realm vid första laddningen av applikationen. För stora volymer, använd strömmande migrering: skriv data parallellt till båda databaserna tills användarna övergår till den nya versionen av applikationen, ta sedan bort SQLite-filen.

Hur hanterar Realm synkroniseringskonflikter?

Realm Sync använder som standard strategin „last write wins” — den senaste skrivningen skriver över den föregående. För komplexa konflikter, konfigurera anpassade Conflict Resolution Functions på MongoDB Atlas-servern som slår samman ändringar från olika enheter baserat på applikationens affärslogik (till exempel sammanfogning av värden istället för ersättning).

Stöder Realm aggregeringsfrågor?

Realm stöder inte SQL-aggregeringar (SUM, AVG, GROUP BY) på databasnivå. För analytiska frågor rekommenderas att exportera data från Realm till MongoDB Atlas via Realm Sync och utföra aggregeringar via MongoDB Aggregation Pipeline. För enkel räkning, använd realm.query<T>().count().

Är data i Realm säkra?

Realm krypterar inte data som standard. För kryptering, ange en 64-byte nyckel i konfigurationen: Realm.Configuration(encryptionKey: key). Kryptering använder AES-256 + SHA-2 HMAC och ökar driftskostnaderna med 10-20%. Utan kryptering kan .realm-filen läsas av vilken process som helst med åtkomst till filsystemet.

Sammanfattning

  • Realm är en objektorienterad NoSQL-databas med memory-mapped åtkomst, levande objekt och cross-plattformsdatamodell för mobilapplikationer.
  • Zero-copy-arkitektur möjliggör direkt läsning av data från memory-mapped fil utan kopiering till språkobjekt, vilket gör Realm 10-50% snabbare än SQLite vid läsning.
  • Live Objects och @ObservedResults (SwiftUI) / Flow (Kotlin) säkerställer automatiska UI-uppdateringar vid dataändringar utan manuella databasfrågor.
  • Realm Sync med MongoDB Atlas erbjuder inbyggd molnsynkronisering med konfliktlösning enligt strategin „last write wins”.
  • Cross-plattforms-SDK:er stöder Kotlin Multiplatform, Flutter, React Native — datamodellen definieras en gång för alla plattformar.
  • För analytiska frågor är Realm svagare än SQLite på grund av avsaknad av gruppaggregeringar — komplexa rapporter utförs via MongoDB Aggregation Pipeline.
  • Rekommendation använd Realm för offline-applikationer med frekventa UI-uppdateringar och behov av cross-plattformssynkronisering, SQLite/Room för projekt med analys och stabila datamängder.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också