Realm је мобилна објектно-оријентисана NoSQL база података, развијена као алтернатива SQLite-у и Core Data-у за iOS и Android. Подаци се чувају у сопственом формату са директним приступом објектима у меморији, што осигурава високу брзину читања и уписа. Захваљујући реактивним обавештењима, аутоматској синхронизацији кроз Realm Sync и вишеплатформном моделу података, Realm се користи на више од 1 милијарди уређаја (подаци MongoDB, 2025).
Главно
Realm је објектно-оријентисана база података креирана посебно за мобилне апликације. За разлику од SQLite-а, Realm не користи SQL и релациони модел — подаци се чувају као живи објекти (Live Objects), којима се приступа директно, без посредног ORM слоја. Програмер ради са обичним објектима језика (Swift, Kotlin, Dart) који се аутоматски чувају у бази података.
Realm се појавио 2014. године као стартап Realm Inc., а 2019. године га је преузела MongoDB Inc. Од тада се Realm развија као MongoDB Realm — део јединствене платформе Atlas Device Sync за мобилну синхронизацију података. Основна локална Realm база података остаје бесплатна и отвореног кода (лиценца Apache 2.0), а Realm Sync (синхронизација у облаку) се наплаћа претплатом.
Према MongoDB Developer Report (2025), Realm се користи у 15% мобилних апликација као главно локално складиште. Главни сценарији су апликације са офлајн режимом, сложеним објектним моделима и потребом за синхронизацијом између уређаја, где Realm надмашује SQLite брзином развоја и лаконћом рада са објектима.
Live Objects — сваки Realm објекат је повезан са диском путем мапирања у меморију (memory-mapped file). Промена објекта у било којој нити се одмах одражава у свим осталим нитима без ручног обавештавања. UI интерфејс се аутоматски прецртава при промени података кроз Realm обавештења. Zero-copy — Realm не копира податке из базе у објекте, објекти су подаци у меморији.
Јзградно Realm-а је написано у C++-у и користи B+ Tree за индексирање података. За разлику од SQLite-а, где је сваки ред запис у релационој табели, Realm чува објекте као чворове у графовској структури са директним референцама између њих (forward pointers). Везе између објеката нису спољни кључеви, већ директни показивачи, што елиминише потребу за JOIN операцијама.
Realm датотеке (.realm) су memory-mapped — оперативни систем сам управља учитавањем страница датотеке у меморију при приступу. То омогућава Realm-у рад са базама које премашују доступну RAM меморију и осигурава каснену касније на нивоу нативних структура језика (као Swift Array или Kotlin List) за податке који стају у RAM.
Memory-mapped датотеке су кључна технологија Realm-а. Уместо да копира податке из датотеке базе у објекте језика (као што SQLite ради кроз sqlite3_step + sqlite3_column_*), Realm мапира датотеку базе директно у адресни простор процеса. Објекти језика су само показивачи на податке у мапираној меморији. Промена објекта мења базу на диску без посебног позива save.
| Карактеристика | Realm (zero-copy) | SQLite (копирање) |
|---|---|---|
| Читање | Директан приступ меморији (наносекунде) | Копирање у објекат (микросекунде) |
| Упис | Тренутни упис у memory-mapped датотеку | save() са SQL INSERT/UPDATE транзакцијом |
| Везе | Директни показивачи (forward pointers) | Foreign key + JOIN |
| Потрошња меморије | Датотека + кеш страница ОС | Објекти + кеш страница SQLite-а |
| Живи објекти | Да (аутоматско ажурирање) | Не (потребан нови fetch) |
Потрошња меморије Realm-а је већа при активном читању (цела датотека или њен велики део је мапиран у меморију), али мања при операцијама уписа, јер не захтева алокацију меморије за копије објеката. За базе величине до 1 GB на мобилним уређајима, memory-mapped приступ даје бољу општу перформансу него SQLite са његовим посредним копирањем.
SQLite је релациони систем за управљање базама података са SQL и ACID транзакцијама. Realm је објектна NoSQL база података са memory-mapped приступом. Core Data је Apple ORM слој изнад SQLite-а. Сваки од три приступа има своју област примене и предности. Realm побеђује у брзини директног приступа објектима и реактивности, SQLite у универзалности и зрелости, Core Data у интеграцији са Apple екосистемом.
Перформанса Realm-а на операцијама читања је 10-50% виша од SQLite-а захваљујући zero-copy приступу. На операцијама уписа Realm је такође бржи захваљујући изостанку SQL синтаксне анализе и директној модификацији memory-mapped страница. Међутим, Realm може да троши више RAM меморије при раду са великим базама (>500 MB), јер се датотека у потпуности мапира у адресни простор.
| Критеријум | Realm | SQLite | Core Data |
|---|---|---|---|
| Тип | NoSQL објектна база | Релациона СУБП (SQL) | ORM изнад SQLite-а |
| Брзина читања | Висока (zero-copy) | Средња | Средња (ORM оптерећење) |
| Реактивност | Live Objects (уграђено) | Потребна овојница (Room/GRDB) | NSFetchedResultsController |
| Синхронизација | Realm Sync (MongoDB Atlas) | Потребна сопствена имплементација | NSPersistentCloudKitContainer |
| Платформе | iOS, Android, Flutter, RN, Node.js | iOS, Android, Web, Desktop | Само iOS/macOS |
| Величина библиотеке | ~4 MB | ~600 KB | Уграђена у SDK |
Избор између Realm-а и SQLite-а често своди се на приоритете: брзина развоја и реактивност (Realm) наспрам контроле и универзалности (SQLite). Realm је посебно добар за MVP и прототипове, где се модел података често мења и је важно брзо добијати живе ажурирање UI-ја. SQLite/Room је поњељан за зреле производе са великим обимом података и захтевним аналитичким упитима.
Realm Kotlin SDK је званична библиотека за Android, написана у Kotlin-у. Модел података се дефинише кроз класе који насљеђују RealmObject, са @PrimaryKey анотацијом за јединствени идентификатор. Realm Kotlin подржава Kotlin Coroutines, Flow и KSP.
RealmQuery пружа type-safe API за филтрирање без SQL-а. Упити се граде ланцом метода: query → filter → sort → find. Резултат може да буде враћен као листа или као Flow (реактивни стрим који се ажурира при промени података).
Модел података Realm се дефинише као data class који имплементира RealmObject. Поље _id је означено са @PrimaryKey за јединствену идентификацију. Веза један-на-више се реализује кроз RealmList. Све операције уписа се извршавају унутар 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()
Flow-повраћајући упит аутоматски емитује нове резултате при свакој промени података у Realm-у. Flow приступ се савршено уклапа са Compose: collectAsState() у ViewModel-у аутоматски прекомпонује UI без ручног ажурирања адаптера.
Realm Swift SDK пружа нативно Swift API са подршком async/await, Combine Publishers и Swift Concurrency. Модели података се дефинишу као класе који насљеђују Object, са @Persisted за својства.
@ObservedRealmObject и @ObservedResults су Property Wrappers за SwiftUI који аутоматски прецртавају View при промени података.
Property Wrapper @ObservedResults повезује Realm упит са приказом у SwiftUI-ју. При промени било којег задатка, SwiftUI аутоматски перекомпонује листу.
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("Додај задатак") {
let realm = try! Realm()
try! realm.write {
realm.add(TaskItem(value: ["title": "New task"]))
}
}
}
}
@ObservedResults аутоматски управља животним циклусом Realm упита: при креирању View-а ствара се претплата на промене, при уништавању отказује се. Property Wrapper прихвата опционални NSPredicate и сортирање.
Офлајн апликације — Realm је идеалан за сценарије где подаци морају бити доступни без интернета. Уграђена синхронизација (Realm Sync са MongoDB Atlas) аутоматски решава конфликте при поновном повезивању.
Реактивни интерфејси — Live Objects и Flow/Combine обавештења чине Realm погодним избором за апликације са често ажурираним подацима.
Вишеплатформни пројекти — Realm подржава Kotlin Multiplatform, Flutter, React Native и Xamarin. Модел података се дефинише једном за све платформе.
Realm Sync је облачка услуга уграђена у MongoDB Atlas. Апликација аутоматски синхронизује податке између уређаја корисника и сервера. Конфликти се решавају по стратегији last write wins.
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)
// Аутоматска синхронизација је активна
}
}
SyncConfiguration конфигурише везу са MongoDB Atlas-ом и одређује скуп синхронизованих модела. Након аутентификације корисника, Realm аутоматски учитава податке из облака и спаја их са локалним променама.
Често постављана питања
Да, локална Realm база је потпуно бесплатна (Apache 2.0). Realm Sync кроз MongoDB Atlas је плаћена услуга. Бесплатни ниво Atlas-а нуди 500 MB и 1 милион операција месечно.
Да, миграција је могућа кроз извоз података из SQLite-а у JSON и увоз у Realm.
Realm Sync по подешавању користи last write wins. За сложеније конфликте, конфигуришите прилагођене функције на серверу MongoDB Atlas-а.
Realm не подржава SQL агрегације. За аналитичке упите користите MongoDB Aggregation Pipeline.
Realm не шифрује податке по подешавању. За шифровање наведите 64-бајтни кључ у конфигурацији.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође