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 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.
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.
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.
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.
| Charakteristika | Realm (zero-copy) | SQLite (kopírování) |
|---|---|---|
| Čtení | Přímý přístup do paměti (nanosekundy) | Kopírování do objektu (mikrosekundy) |
| Zápis | Okamžitý zápis do memory-mapped souboru | save() s transakcí SQL INSERT/UPDATE |
| Vztahy | Přímé ukazatele (forward pointers) | Foreign key + JOIN |
| Spotřeba paměti | Soubor + cache stránek OS | Objekty + cache stránek SQLite |
| Živé objekty | Ano (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.
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érium | Realm | SQLite | Core Data |
|---|---|---|---|
| Typ | NoSQL objektová databáze | Relační DBMS (SQL) | ORM nad SQLite |
| Rychlost čtení | Vysoká (zero-copy) | Střední | Střední (režie ORM) |
| Reaktivita | Live Objects (vestavěná) | Je potřeba wrapper (Room/GRDB) | NSFetchedResultsController |
| Synchronizace | Realm Sync (MongoDB Atlas) | Vyžaduje vlastní implementaci | NSPersistentCloudKitContainer |
| Platformy | iOS, Android, Flutter, RN, Node.js | iOS, Android, Web, Desktop | Pouze iOS/macOS |
| Velikost knihovny | ~4 MB | ~600 KB | Vestavě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 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: query → filter → sort → find. 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).
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.
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 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.
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.
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.
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 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.
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
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ě.
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.
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í).
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().
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í
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í.
Přečtěte si také