Realm v mobilních aplikacích: co to je a jak funguje

Autor: IT Sectr Publikováno: 2026-03-12 Doba čtení: 11 min

Realm je mobilní objektově orientovaná NoSQL databáze vyvinutá jako alternativa k SQLite a Core Data pro iOS a Android. Data jsou uložena ve vlastním formátu s přímým přístupem k objektům v paměti, což zajišťuje vysokou rychlost čtení a zápisu. Díky reaktivním oznámením, automatické synchronizaci prostřednictvím Realm Sync a cross-platform datovému modelu je Realm používán na více než 1 miliardě zařízení (data MongoDB, 2025).

Hlavní body

  • Realm je NoSQL objektová databáze pro mobilní platformy s přímým přístupem k datům v operační paměti.
  • Live Objects objekty Realm se automaticky aktualizují při změně dat bez ručního načítání.
  • Zero-copy data se nekopírují mezi vrstvami aplikace, což eliminuje režii ORM.
  • Realm Sync vestavěná synchronizace mezi zařízeními prostřednictvím MongoDB Atlas Device Sync.
  • Cross-platform datový model je definován jednou pro iOS, Android, Flutter a React Native.

Co je Realm?

Realm je objektově orientovaná databáze vytvořená speciálně pro mobilní aplikace. Na rozdíl od SQLite, Realm nepoužívá SQL a relační model — data jsou uložena jako živé objekty (Live Objects), ke kterým je přímý přístup bez zprostředkující vrstvy ORM. Vývojář pracuje s běžnými objekty jazyka (Swift, Kotlin, Dart), které se automaticky ukládají do databáze.

Realm se objevil v roce 2014 jako startup Realm Inc. a v roce 2019 byl získán společností MongoDB Inc. Od té doby je Realm vyvíjen jako MongoDB Realm — součást jednotné platformy Atlas Device Sync pro mobilní synchronizaci dat. Místní databáze Realm zůstává zdarma a otevřená (licence Apache 2.0), zatímco Realm Sync (cloudová synchronizace) je distribuován na základě předplatného.

Podle MongoDB Developer Report (2025) je Realm používán v 15% mobilních aplikací jako primární místní úložiště. Hlavní scénáře jsou aplikace s offline režimem, komplexními objektovými modely a potřebou synchronizace mezi zařízeními, kde Realm překonává SQLite v rychlosti vývoje a pohodlí práce s objekty.

Principy Realm

Live Objects každý objekt Realm je připojen k disku prostřednictvím memory-mapped souboru. Změna objektu v jakémkoli vlákně se okamžitě projeví ve všech ostatních vláknech bez ručního upozornění. Uživatelské rozhraní se automaticky překreslí při změně dat prostřednictvím oznámení Realm. Zero-copy Realm nekopíruje data z databáze do objektů, objekty jsou samotná data v paměti.

Jak je Realm strukturován: architektura a ukládání

Jádro Realm je napsáno v C++ a používá B+ Tree pro indexování dat. Na rozdíl od SQLite, kde je každý řádek záznamem v relační tabulce, Realm ukládá objekty jako uzly v grafové struktuře s přímými referencemi mezi nimi (forward pointers). Vztahy mezi objekty nejsou foreign keys, ale přímé ukazatele, což eliminuje potřebu JOIN operací.

Soubory Realm (přípona .realm) jsou memory-mapped — OS sám řídí načítání stránek souboru do paměti při přístupu. To umožňuje Realm pracovat s databázemi přesahujícími dostupnou operační paměť a zajišťuje latenci čtení na úrovni nativních datových struktur jazyka (Swift Array nebo Kotlin List) pro data, která se vejdou do RAM.

Zero-copy a Live Objects

Memory-mapped soubory jsou klíčovou technologií Realm. Místo kopírování dat z databázového souboru do jazykových objektů (jak to dělá SQLite pomocí sqlite3_step + sqlite3_column_*), Realm mapuje databázový soubor přímo do adresního prostoru procesu. Jazykové objekty jsou pouze ukazatele na data v mapované paměti. Změna objektu mění databázi na disku bez samostatného volání save.

CharakteristikaRealm (zero-copy)SQLite (kopírování)
ČteníPřímý přístup do paměti (nanosekundy)Kopírování do objektu (mikrosekundy)
ZápisOkamžitý zápis do memory-mapped souborusave() s transakcí SQL INSERT/UPDATE
VztahyPřímé ukazatele (forward pointers)Foreign key + JOIN
Spotřeba pamětiSoubor + cache stránek OSObjekty + cache stránek SQLite
Živé objektyAno (automatická aktualizace)Ne (vyžaduje nové fetch)

Spotřeba paměti Realm je vyšší při aktivním čtení (celý soubor nebo jeho velká část je mapována do paměti), ale nižší při operacích zápisu, protože není vyžadována alokace paměti pro kopie objektů. Pro databáze do velikosti 1 GB na mobilních zařízeních poskytuje memory-mapped přístup lepší celkový výkon než SQLite s jejím průběžným kopírováním.

Realm vs SQLite vs Core Data: srovnání

SQLite je relační systém řízení báze dat s SQL a ACID transakcemi. Realm je objektová NoSQL databáze s memory-mapped přístupem. Core Data je ORM vrstva Apple nad SQLite. Každý ze tří přístupů má svou oblast použití a silné stránky. Realm vítězí v rychlosti přímého přístupu k objektům a reaktivitě, SQLite v univerzálnosti a vyspělosti, Core Data v integraci s ekosystémem Apple.

Výkon Realm při čtení je o 10-50% vyšší než SQLite díky zero-copy přístupu. Při zápisu je Realm také rychlejší díky absenci syntaktické analýzy SQL a přímé změně memory-mapped stránek. Nicméně Realm může spotřebovávat více operační paměti při práci s velkými databázemi (>500 MB), protože soubor je plně mapován do adresního prostoru.

KritériumRealmSQLiteCore Data
TypNoSQL objektová databázeRelační DBMS (SQL)ORM nad SQLite
Rychlost čteníVysoká (zero-copy)StředníStřední (režie ORM)
ReaktivitaLive Objects (vestavěná)Je potřeba wrapper (Room/GRDB)NSFetchedResultsController
SynchronizaceRealm Sync (MongoDB Atlas)Vyžaduje vlastní implementaciNSPersistentCloudKitContainer
PlatformyiOS, Android, Flutter, RN, Node.jsiOS, Android, Web, DesktopPouze iOS/macOS
Velikost knihovny~4 MB~600 KBVestavěno v SDK

Volba mezi Realm a SQLite často závisí na prioritách: rychlost vývoje a reaktivita (Realm) versus kontrola a univerzálnost (SQLite). Realm je obzvláště dobrý pro MVP a prototypy, kde se datový model často mění a je důležité rychle získávat živé aktualizace UI. SQLite/Room je preferován pro zralé produkty s velkými objemy dat a komplexními analytickými dotazy.

Realm na Androidu: Kotlin SDK

Realm Kotlin SDK je oficiální knihovna pro Android napsaná v Kotlin (ne wrapper nad Java SDK). Datový model je definován prostřednictvím tříd dědících z RealmObject s anotací @PrimaryKey pro jedinečný identifikátor. Realm Kotlin podporuje Kotlin Coroutines, Flow a KSP (Kotlin Symbol Processing) pro generování kódu při kompilaci.

RealmQuery poskytuje type-safe API pro filtrování bez SQL. Dotazy se vytvářejí řetězením metod: queryfiltersortfind. Výsledek může být vrácen jako seznam (s načtením do paměti) nebo jako Flow (reaktivní proud, který se aktualizuje při změně dat). Realm Kotlin také podporuje vnořené objekty a seznamy (RealmList).

Příklad Realm Kotlin SDK

Datový model Realm je definován jako data class implementující rozhraní RealmObject. Pole _id je označeno @PrimaryKey pro jedinečnou identifikaci. Vztah „jeden-k-mnoha“ je implementován prostřednictvím RealmList — seznamu dalších RealmObjectů. Všechny operace zápisu (create, update, delete) se provádějí uvnitř transakčního bloku write.

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

Dotaz vracející Flow automaticky emituje nové výsledky při každé změně dat v Realm: přidání, aktualizaci nebo smazání Project nebo Task. Flow přístup se ideálně kombinuje s Compose: collectAsState() ve ViewModel automaticky překomponuje UI při změně dat bez ruční aktualizace adaptérů seznamu nebo použití LiveData.

Realm na iOS: Swift SDK

Realm Swift SDK poskytuje nativní Swift API s podporou async/await, Combine Publishers a Swift Concurrency. Datové modely jsou definovány jako třídy dědící z Object s použitím @Persisted pro vlastnosti. Realm Swift automaticky aktualizuje objekty při změnách a oznámení (NotificationToken) umožňují přihlásit se k odběru změn jednotlivých objektů nebo kolekcí.

@ObservedRealmObject a @ObservedResults jsou Property Wrappery pro SwiftUI, které automaticky překreslují View při změně dat Realm. @ObservedResults pracuje s výsledky dotazů, @ObservedRealmObject s konkrétním objektem. Obě vlastnosti ruší odběr při deinicializaci View.

Příklad Realm Swift SDK

Integrace SwiftUI Realm je jednou z nejsilnějších stránek SDK. Property Wrapper @ObservedResults propojuje Realm dotaz se zobrazením ve SwiftUI. Při změně jakéhokoli úkolu SwiftUI automaticky překomponuje seznam. realm.writeAsync provádí transakce na pozadí bez blokování 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("Přidat úkol") {
            let realm = try! Realm()
            try! realm.write {
                realm.add(TaskItem(value: ["title": "New task"]))
            }
        }
    }
}

@ObservedResults automaticky spravuje životní cyklus Realm dotazu: při vytvoření View se vytvoří odběr změn, při zničení se zruší. Property Wrapper přijímá volitelný predikát (NSPredicate) a řazení. To eliminuje potřebu ručně psát fetch dotazy, vytvářet ViewModel a přihlašovat se k odběru oznámení Realm.

Scénáře použití Realm

Offline aplikace Realm je ideální pro scénáře, kde data musí být dostupná bez internetu. Vestavěná synchronizace (Realm Sync s MongoDB Atlas) automaticky řeší konflikty při připojení k síti. Aplikace nadále pracuje s místními daty a synchronizace na pozadí je aktualizuje, když je připojení k dispozici.

Reaktivní rozhraní Live Objects a oznámení Flow/Combine dělají z Realm pohodlnou volbu pro aplikace s často se měnícími daty: chaty, kanály úkolů, sdílené dokumenty. UI se automaticky aktualizuje při přidání, změně nebo smazání dat bez ručního volání reloadData nebo invalidate.

Cross-platform projekty Realm podporuje Kotlin Multiplatform (KMP), Flutter, React Native a Xamarin. Datový model je definován jednou a používán na všech platformách. To snižuje duplicitu kódu a zaručuje konzistenci datového schématu mezi iOS a Android aplikacemi se sdílenou obchodní logikou.

Realm Sync: synchronizace prostřednictvím MongoDB Atlas

Realm Sync je cloudová služba vestavěná do MongoDB Atlas. Aplikace automaticky synchronizuje data mezi zařízeními uživatele a serverem. Konflikty se řeší podle strategie „last write wins“ nebo prostřednictvím vlastních funkcí Conflict Resolution na serveru. Realm Sync podporuje částečnou synchronizaci (podmnožina dat) pro snížení přenosu dat.

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)
        // Automatická synchronizace je aktivní
    }
}

SyncConfiguration konfiguruje připojení k MongoDB Atlas a určuje sadu synchronizovaných modelů. Po autentizaci uživatele Realm automaticky načte data z cloudu a sloučí je s místními změnami. Synchronizace běží na pozadí a nevyžaduje ruční volání — stačí vytvořit instanci Realm s SyncConfiguration.

Často kladené otázky

Je Realm zdarma pro komerční použití?

Ano, místní Realm databáze je zcela zdarma (licence Apache 2.0). Realm Sync (cloudová synchronizace) prostřednictvím MongoDB Atlas je placená služba zahrnutá v předplatném Atlas Device Sync. Pro bezplatnou úroveň Atlas je k dispozici prvních 500 MB dat a 1 milion operací měsíčně.

Lze migrovat z SQLite na Realm?

Ano, migrace je možná exportem dat z SQLite do JSON a importem do Realm při prvním načtení aplikace. Pro velké objemy použijte streamovanou migraci: zapisujte data paralelně do obou databází, dokud uživatelé nepřejdou na novou verzi aplikace, poté odstraňte SQLite soubor.

Jak Realm řeší konflikty synchronizace?

Realm Sync ve výchozím nastavení používá strategii „last write wins“ — poslední zápis přepíše předchozí. Pro složité konflikty nakonfigurujte vlastní funkce Conflict Resolution na serveru MongoDB Atlas, které slučují změny z různých zařízení podle obchodní logiky aplikace (například sloučení hodnot namísto nahrazení).

Podporuje Realm agregační dotazy?

Realm nepodporuje SQL agregace (SUM, AVG, GROUP BY) na úrovni databáze. Pro analytické dotazy doporučujeme exportovat data z Realm do MongoDB Atlas prostřednictvím Realm Sync a provádět agregace přes MongoDB Aggregation Pipeline. Pro jednoduché výpočty použijte realm.query<T>().count().

Jsou data v Realm bezpečná?

Realm ve výchozím nastavení data nešifruje. Pro šifrování zadejte 64-bajtový klíč v konfiguraci: Realm.Configuration(encryptionKey: key). Šifrování používá AES-256 + SHA-2 HMAC a zvyšuje režii operací o 10-20%. Bez šifrování může .realm soubor přečíst jakýkoli proces s přístupem k souborovému systému.

Shrnutí

  • Realm je objektově orientovaná NoSQL databáze s memory-mapped přístupem, živými objekty a cross-platform datovým modelem pro mobilní aplikace.
  • Zero-copy architektura umožňuje přímé čtení dat z memory-mapped souboru bez kopírování do jazykových objektů, což dělá Realm o 10-50% rychlejší než SQLite při čtení.
  • Live Objects a @ObservedResults (SwiftUI) / Flow (Kotlin) zajišťují automatické aktualizace UI při změně dat bez ručních databázových dotazů.
  • Realm Sync s MongoDB Atlas poskytuje vestavěnou cloudovou synchronizaci s řešením konfliktů strategií „last write wins“.
  • Cross-platform SDK podporují Kotlin Multiplatform, Flutter, React Native — datový model je definován jednou pro všechny platformy.
  • Pro analytické dotazy je Realm slabší než SQLite kvůli chybějícím skupinovým agregacím — složité reporty se provádějí přes MongoDB Aggregation Pipeline.
  • Doporučení používejte Realm pro offline aplikace s častými aktualizacemi UI a potřebou cross-platform synchronizace, SQLite/Room pro projekty s analytikou a stabilními datovými sadami.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také