Realm a mobilalkalmazásokban: mi ez és hogyan működik

Szerző: IT Sectr Megjelenés: 2026-03-12 Olvasási idő: 11 perc

A Realm egy mobil objektum-orientált NoSQL adatbázis, amelyet az SQLite és a Core Data alternatívájaként fejlesztettek iOS és Android rendszerekhez. Az adatok saját formátumban tárolódnak, közvetlen hozzáféréssel a memóriában lévő objektumokhoz, ami nagy olvasási és írási sebességet biztosít. A reaktív értesítéseknek, a Realm Sync-en keresztüli automatikus szinkronizációnak és a cross-platform adatmodellnek köszönhetően a Realm-et több mint 1 milliárd eszköz használja (MongoDB adatok, 2025).

Főbb pontok

  • Realm egy NoSQL objektumadatbázis mobilos platformokhoz, közvetlen hozzáféréssel az operatív memóriában lévő adatokhoz.
  • Live Objects a Realm objektumok automatikusan frissülnek az adatok változásakor, kézi újratöltés nélkül.
  • Zero-copy az adatok nem másolódnak az alkalmazás rétegei között, ami kiküszöböli az ORM többletterhelését.
  • Realm Sync beépített szinkronizáció az eszközök között a MongoDB Atlas Device Sync segítségével.
  • Cross-platform az adatmodell egyszer kerül meghatározásra iOS, Android, Flutter és React Native rendszerekhez.

Mi az a Realm?

Realm egy objektum-orientált adatbázis, amelyet kifejezetten mobilalkalmazásokhoz hoztak létre. Az SQLite-tól eltérően a Realm nem használ SQL-t és relációs modellt — az adatok élő objektumokként (Live Objects) tárolódnak, amelyek közvetlenül, köztes ORM réteg nélkül érhetők el. A fejlesztő a nyelv szokásos objektumaival (Swift, Kotlin, Dart) dolgozik, amelyek automatikusan elmentődnek az adatbázisba.

A Realm 2014-ben jelent meg Realm Inc. startupként, és 2019-ben felvásárolta a MongoDB Inc. Azóta a Realm MongoDB Realmként fejlődik — az egységes Atlas Device Sync platform részeként a mobilos adatszinkronizációhoz. A helyi Realm adatbázis továbbra is ingyenes és nyílt forráskódú (Apache 2.0 licenc), míg a Realm Sync (felhőalapú szinkronizáció) előfizetéses alapon érhető el.

A MongoDB Developer Report (2025) szerint a Realm-et a mobilalkalmazások 15%-a használja elsődleges helyi tárolóként. A fő forgatókönyvek közé tartoznak az offline módot igénylő alkalmazások, összetett objektummodellek és eszközök közötti szinkronizációs igények, ahol a Realm felülmúlja az SQLite-ot a fejlesztési sebességben és az objektumokkal való munkavégzés kényelmében.

A Realm alapelvei

Live Objects minden Realm objektum memórialeképezett fájlon (memory-mapped file) keresztül kapcsolódik a lemezhez. Egy objektum bármely szálban történő módosítása azonnal megjelenik az összes többi szálban, kézi értesítés nélkül. A felhasználói felület automatikusan újrarajzolódik az adatok változásakor a Realm értesítéseken keresztül. Zero-copy a Realm nem másol adatokat az adatbázisból az objektumokba, az objektumok maguk a memóriában lévő adatok.

Hogyan épül fel a Realm: architektúra és tárolás

A Realm magja C++-ban íródott, és B+ Tree-t használ az adatok indexeléséhez. Az SQLite-tól eltérően, ahol minden sor egy rekord egy relációs táblában, a Realm az objektumokat csomópontokként tárolja egy gráfszerkezetben, közvetlen hivatkozásokkal közöttük (forward pointers). Az objektumok közötti kapcsolatok nem foreign key-ek, hanem közvetlen mutatók, ami kiküszöböli a JOIN műveletek szükségességét.

A Realm fájlok (.realm kiterjesztés) memory-mapped jellegűek — az operációs rendszer maga kezeli a fájloldalak memóriába töltését a hozzáférés során. Ez lehetővé teszi a Realm számára, hogy a rendelkezésre álló RAM-nál nagyobb adatbázisokkal dolgozzon, és a RAM-ba elférő adatok esetében a nyelv natív adatszerkezeteinek (Swift Array vagy Kotlin List) szintjén biztosít olvasási késleltetést.

Zero-copy és Live Objects

Memory-mapped fájlok a Realm kulcsfontosságú technológiája. Ahelyett, hogy az adatbázisfájlból a nyelvi objektumokba másolná az adatokat (ahogy az SQLite teszi az sqlite3_step + sqlite3_column_* segítségével), a Realm az adatbázisfájlt közvetlenül a folyamat címtartományába képezi le. A nyelvi objektumok csupán mutatók a leképezett memóriában lévő adatokra. Egy objektum módosítása külön save hívás nélkül megváltoztatja az adatbázist a lemezen.

JellemzőRealm (zero-copy)SQLite (másolás)
OlvasásKözvetlen memória hozzáférés (nanoszekundumok)Másolás objektumba (mikroszekundumok)
ÍrásAzonnali írás memory-mapped fájlbasave() SQL INSERT/UPDATE tranzakcióval
KapcsolatokKözvetlen mutatók (forward pointers)Foreign key + JOIN
Memória fogyasztásFájl + OS oldal gyorsítótárObjektumok + SQLite oldal gyorsítótár
Élő objektumokIgen (automatikus frissítés)Nem (új fetch szükséges)

A memória fogyasztása a Realm esetében aktív olvasáskor magasabb (a teljes fájl vagy nagy része a memóriába van képezve), de írási műveleteknél alacsonyabb, mivel nincs szükség memória allokálásra objektummásolatok számára. Legfeljebb 1 GB méretű adatbázisok esetén mobileszközökön a memory-mapped megközelítés jobb általános teljesítményt nyújt, mint az SQLite a köztes másolással.

Realm vs SQLite vs Core Data: összehasonlítás

SQLite egy relációs adatbázis-kezelő rendszer SQL-lel és ACID tranzakciókkal. A Realm egy objektum-orientált NoSQL adatbázis memory-mapped hozzáféréssel. A Core Data egy Apple ORM réteg az SQLite tetején. Mindhárom megközelítésnek megvan a maga alkalmazási területe és erőssége. A Realm a közvetlen objektumhozzáférés sebességében és reaktivitásában nyer, az SQLite az univerzalitásban és érettségben, a Core Data az Apple ökoszisztémával való integrációban.

A Realm teljesítménye olvasási műveleteknél 10-50%-kal magasabb, mint az SQLite-é a zero-copy hozzáférésnek köszönhetően. Írási műveleteknél a Realm szintén gyorsabb az SQL szintaktikai elemzés hiánya és a memory-mapped oldalak közvetlen módosítása miatt. Azonban a Realm több operatív memóriát fogyaszthat nagy adatbázisok (>500 MB) esetén, mivel a fájl teljes egészében a címtartományba van képezve.

KritériumRealmSQLiteCore Data
TípusNoSQL objektum adatbázisRelációs DBMS (SQL)ORM az SQLite tetején
Olvasási sebességMagas (zero-copy)KözepesKözepes (ORM overhead)
ReaktivitásLive Objects (beépített)Wrapper szükséges (Room/GRDB)NSFetchedResultsController
SzinkronizációRealm Sync (MongoDB Atlas)Egyedi implementáció szükségesNSPersistentCloudKitContainer
PlatformokiOS, Android, Flutter, RN, Node.jsiOS, Android, Web, DesktopCsak iOS/macOS
Könyvtár mérete~4 MB~600 KBBeépítve az SDK-ba

A Realm és SQLite közötti választás gyakran a prioritásokon múlik: fejlesztési sebesség és reaktivitás (Realm) szemben a kontrollal és univerzalitással (SQLite). A Realm különösen jó MVP-khez és prototípusokhoz, ahol az adatmodell gyakran változik, és fontos az élő UI frissítések gyors elérése. Az SQLite/Room az érett termékek számára előnyösebb nagy adatmennyiségekkel és összetett analitikai lekérdezésekkel.

Realm Androidon: Kotlin SDK

Realm Kotlin SDK a hivatalos könyvtár Androidhoz, Kotlinban írva (nem wrapper a Java SDK felett). Az adatmodell a RealmObject-ból származó osztályokon keresztül kerül meghatározásra, @PrimaryKey annotációval az egyedi azonosítóhoz. A Realm Kotlin támogatja a Kotlin Coroutines-t, Flow-t és KSP-t (Kotlin Symbol Processing) a fordítási idejű kódgeneráláshoz.

RealmQuery type-safe API-t biztosít a szűréshez SQL nélkül. A lekérdezések metódusláncolattal épülnek fel: queryfiltersortfind. Az eredmény visszaadható listaként (memóriába töltéssel) vagy Flow-ként (reaktív adatfolyam, amely az adatok változásakor frissül). A Realm Kotlin támogatja a beágyazott objektumokat és listákat (RealmList) is.

Példa Realm Kotlin SDK

Az adatmodell Realm adat osztályként (data class) kerül meghatározásra, amely implementálja a RealmObject interfészt. A _id mező @PrimaryKey-vel van jelölve az egyedi azonosításhoz. Az „egy-többhöz“ kapcsolat RealmList-en keresztül valósul meg — más RealmObject-ok listáján. Minden írási művelet (create, update, delete) a write tranzakciós blokkon belül történik.

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

Egy Flow-t visszaadó lekérdezés automatikusan új eredményeket bocsát ki a Realm-ben történő bármilyen adatváltozáskor: Project vagy Task hozzáadásakor, frissítésekor vagy törlésekor. A Flow megközelítés ideálisan kombinálható a Compose-szal: a ViewModel-ben lévő collectAsState() automatikusan újrakomponálja a UI-t az adatok változásakor, a lista adapterek kézi frissítése vagy a LiveData használata nélkül.

Realm iOS-en: Swift SDK

Realm Swift SDK natív Swift API-t biztosít async/await, Combine Publishers és Swift Concurrency támogatással. Az adatmodellek a Object-ból származó osztályokként kerülnek meghatározásra, @Persisted használatával a tulajdonságokhoz. A Realm Swift automatikusan frissíti az objektumokat a változásokkor, és az értesítések (NotificationToken) lehetővé teszik az egyes objektumok vagy gyűjtemények változásaira való feliratkozást.

@ObservedRealmObject és @ObservedResults Property Wrapperek SwiftUI-hoz, amelyek automatikusan újrarajzolják a View-t a Realm adatok változásakor. Az @ObservedResults lekérdezési eredményekkel dolgozik, az @ObservedRealmObject egy adott objektummal. Mindkét tulajdonság lemondja a feliratkozást a View deinicializálásakor.

Példa Realm Swift SDK

A SwiftUI integráció a Realm egyik erőssége. Az @ObservedResults Property Wrapper összekapcsolja a Realm lekérdezést a SwiftUI-ban történő megjelenítéssel. Bármely feladat változásakor a SwiftUI automatikusan újrakomponálja a listát. A realm.writeAsync a tranzakciókat háttérszálon hajtja végre a UI blokkolása nélkül.

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("Feladat hozzáadása") {
            let realm = try! Realm()
            try! realm.write {
                realm.add(TaskItem(value: ["title": "New task"]))
            }
        }
    }
}

@ObservedResults automatikusan kezeli a Realm lekérdezés életciklusát: a View létrehozásakor feliratkozás jön létre a változásokra, megsemmisítéskor pedig lemondásra kerül. A Property Wrapper opcionális predikátumot (NSPredicate) és rendezést fogad el. Ez kiküszöböli a fetch lekérdezések kézi írásának, a ViewModel létrehozásának és a Realm értesítésekre való feliratkozásnak a szükségességét.

A Realm használati forgatókönyvei

Offline alkalmazások A Realm ideális olyan forgatókönyvekhez, ahol az adatoknak internet nélkül is elérhetőnek kell lenniük. A beépített szinkronizáció (Realm Sync a MongoDB Atlas-szal) automatikusan feloldja az ütközéseket a hálózathoz való csatlakozáskor. Az alkalmazás tovább dolgozik a helyi adatokkal, és a háttér-szinkronizáció frissíti azokat, amikor a kapcsolat elérhetővé válik.

Reaktív felületek A Live Objects és a Flow/Combine értesítések a Realm-et kényelmes választássá teszik a gyakran változó adatokkal rendelkező alkalmazásokhoz: csevegések, feladatfolyamok, közös dokumentumok. A UI automatikusan frissül az adatok hozzáadásakor, módosításakor vagy törlésekor, kézi reloadData vagy invalidate hívás nélkül.

Cross-platform projektek A Realm támogatja a Kotlin Multiplatform (KMP), Flutter, React Native és Xamarin rendszereket. Az adatmodell egyszer kerül meghatározásra és minden platformon használatos. Ez csökkenti a kód duplikációját és garantálja az adatséma konzisztenciáját a közös üzleti logikával rendelkező iOS és Android alkalmazások között.

Realm Sync: szinkronizáció a MongoDB Atlas segítségével

Realm Sync egy felhőalapú szolgáltatás, amely a MongoDB Atlas-ba van beépítve. Az alkalmazás automatikusan szinkronizálja az adatokat a felhasználó eszközei és a szerver között. Az ütközések a „last write wins” stratégia szerint vagy egyedi Conflict Resolution Functions segítségével oldódnak fel a szerveren. A Realm Sync támogatja a részleges szinkronizációt (adatrészhalmaz) a forgalom csökkentése érdekében.

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)
        // Automatikus szinkronizáció aktív
    }
}

SyncConfiguration konfigurálja a MongoDB Atlas kapcsolatot és meghatározza a szinkronizálandó modellek halmazát. A felhasználó hitelesítése után a Realm automatikusan betölti az adatokat a felhőből, és egyesíti azokat a helyi változtatásokkal. A szinkronizáció háttérszálon működik, és nem igényel kézi hívást — elegendő egy Realm példány létrehozása SyncConfiguration segítségével.

Gyakran Ismételt Kérdések

Ingyenes a Realm kereskedelmi használatra?

Igen, a helyi Realm adatbázis teljesen ingyenes (Apache 2.0 licenc). A Realm Sync (felhőalapú szinkronizáció) a MongoDB Atlas segítségével fizetős szolgáltatás, amely az Atlas Device Sync előfizetés része. Az Atlas ingyenes szintjén az első 500 MB adat és havi 1 millió művelet érhető el.

Lehet migrálni SQLite-ról Realm-re?

Igen, a migráció lehetséges az adatok SQLite-ból JSON-be exportálásával és a Realm-be történő importálásával az alkalmazás első betöltésekor. Nagy mennyiségek esetén használjon streaming migrációt: írja párhuzamosan az adatokat mindkét adatbázisba, amíg a felhasználók át nem váltanak az alkalmazás új verziójára, majd törölje az SQLite fájlt.

Hogyan kezeli a Realm a szinkronizációs ütközéseket?

Realm Sync alapértelmezés szerint a „last write wins” stratégiát használja — az utolsó írás felülírja az előzőt. Összetett ütközések esetén konfiguráljon egyedi Conflict Resolution Functions függvényeket a MongoDB Atlas szerveren, amelyek egyesítik a különböző eszközökről érkező változtatásokat az alkalmazás üzleti logikája szerint (például értékek egyesítése a csere helyett).

Támogatja a Realm az aggregációs lekérdezéseket?

Realm nem támogatja az SQL aggregációkat (SUM, AVG, GROUP BY) adatbázis szinten. Analitikai lekérdezésekhez ajánlott az adatokat a Realm-ből a MongoDB Atlas-ba exportálni a Realm Sync segítségével, és az aggregációkat a MongoDB Aggregation Pipeline-on keresztül végrehajtani. Egyszerű számlálásokhoz használja a realm.query<T>().count() függvényt.

Biztonságosak a Realm-ben tárolt adatok?

Realm alapértelmezés szerint nem titkosítja az adatokat. A titkosításhoz adjon meg egy 64 bájtos kulcsot a konfigurációban: Realm.Configuration(encryptionKey: key). A titkosítás AES-256 + SHA-2 HMAC-et használ, és 10-20%-kal növeli a műveletek többletterhelését. Titkosítás nélkül a .realm fájl bármely, a fájlrendszerhez hozzáférő folyamat által olvasható.

Összefoglalás

  • Realm egy objektum-orientált NoSQL adatbázis memory-mapped hozzáféréssel, élő objektumokkal és cross-platform adatmodellel mobilalkalmazásokhoz.
  • Zero-copy architektúra lehetővé teszi az adatok közvetlen olvasását a memory-mapped fájlból a nyelvi objektumokba másolás nélkül, ami a Realm-et 10-50%-kal gyorsabbá teszi az SQLite-nál olvasásban.
  • Live Objects és @ObservedResults (SwiftUI) / Flow (Kotlin) automatikus UI frissítéseket biztosítanak adatváltozások esetén, kézi adatbázis lekérdezések nélkül.
  • Realm Sync a MongoDB Atlas-szal beépített felhőalapú szinkronizációt nyújt „last write wins” ütközésfeloldási stratégiával.
  • Cross-platform SDK-k támogatják a Kotlin Multiplatform-ot, Flutter-t, React Native-ot — az adatmodell egyszer kerül meghatározásra minden platformhoz.
  • Analitikai lekérdezésekhez a Realm gyengébb az SQLite-nál a csoportos aggregációk hiánya miatt — az összetett jelentések a MongoDB Aggregation Pipeline-on keresztül készülnek.
  • Javaslat használja a Realm-et offline alkalmazásokhoz gyakori UI frissítésekkel és cross-platform szinkronizációs igényekkel, az SQLite/Room-ot analitikai és stabil adatkészletekkel rendelkező projektekhez.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is