Realm у мобилним апликацијама: шта је то и како ради

Аутор: IT Sectr Објављено: 2026-03-12 Време читања: 11 мин

Realm је мобилна објектно-оријентисана NoSQL база података, развијена као алтернатива SQLite-у и Core Data-у за iOS и Android. Подаци се чувају у сопственом формату са директним приступом објектима у меморији, што осигурава високу брзину читања и уписа. Захваљујући реактивним обавештењима, аутоматској синхронизацији кроз Realm Sync и вишеплатформном моделу података, Realm се користи на више од 1 милијарди уређаја (подаци MongoDB, 2025).

Главно

  • Realm — NoSQL објектна база података за мобилне платформе са директним приступом подацима у оперативној меморији.
  • Live Objects — објекти Realm се аутоматски ажурирају при промени података без ручног поновног учитавања.
  • Zero-copy — подаци се не копирају између слојева апликације, што елиминише оптерећење ORM-а.
  • Realm Sync — уграђена синхронизација између уређаја кроз MongoDB Atlas Device Sync.
  • Вишеплатформност — модел података се дефинише једном за iOS, Android, Flutter и React Native.

Шта је Realm?

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 брзином развоја и лаконћом рада са објектима.

Принципи Realm-а

Live Objects — сваки Realm објекат је повезан са диском путем мапирања у меморију (memory-mapped file). Промена објекта у било којој нити се одмах одражава у свим осталим нитима без ручног обавештавања. UI интерфејс се аутоматски прецртава при промени података кроз Realm обавештења. Zero-copy — Realm не копира податке из базе у објекте, објекти су подаци у меморији.

Како је постављен Realm: архитектура и складиштење

Јзградно Realm-а је написано у C++-у и користи B+ Tree за индексирање података. За разлику од SQLite-а, где је сваки ред запис у релационој табели, Realm чува објекте као чворове у графовској структури са директним референцама између њих (forward pointers). Везе између објеката нису спољни кључеви, већ директни показивачи, што елиминише потребу за JOIN операцијама.

Realm датотеке (.realm) су memory-mapped — оперативни систем сам управља учитавањем страница датотеке у меморију при приступу. То омогућава Realm-у рад са базама које премашују доступну RAM меморију и осигурава каснену касније на нивоу нативних структура језика (као Swift Array или Kotlin List) за податке који стају у RAM.

Zero-copy и Live Objects

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 са његовим посредним копирањем.

Realm vs SQLite vs Core Data: поређење

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), јер се датотека у потпуности мапира у адресни простор.

КритеријумRealmSQLiteCore Data
ТипNoSQL објектна базаРелациона СУБП (SQL)ORM изнад SQLite-а
Брзина читањаВисока (zero-copy)СредњаСредња (ORM оптерећење)
РеактивностLive Objects (уграђено)Потребна овојница (Room/GRDB)NSFetchedResultsController
СинхронизацијаRealm Sync (MongoDB Atlas)Потребна сопствена имплементацијаNSPersistentCloudKitContainer
ПлатформеiOS, Android, Flutter, RN, Node.jsiOS, Android, Web, DesktopСамо iOS/macOS
Величина библиотеке~4 MB~600 KBУграђена у SDK

Избор између Realm-а и SQLite-а често своди се на приоритете: брзина развоја и реактивност (Realm) наспрам контроле и универзалности (SQLite). Realm је посебно добар за MVP и прототипове, где се модел података често мења и је важно брзо добијати живе ажурирање UI-ја. SQLite/Room је поњељан за зреле производе са великим обимом података и захтевним аналитичким упитима.

Realm на Android-у: Kotlin SDK

Realm Kotlin SDK је званична библиотека за Android, написана у Kotlin-у. Модел података се дефинише кроз класе који насљеђују RealmObject, са @PrimaryKey анотацијом за јединствени идентификатор. Realm Kotlin подржава Kotlin Coroutines, Flow и KSP.

RealmQuery пружа type-safe API за филтрирање без SQL-а. Упити се граде ланцом метода: query → filter → sort → find. Резултат може да буде враћен као листа или као Flow (реактивни стрим који се ажурира при промени података).

Пример Realm Kotlin SDK

Модел података Realm се дефинише као data class који имплементира RealmObject. Поље _id је означено са @PrimaryKey за јединствену идентификацију. Веза један-на-више се реализује кроз RealmList. Све операције уписа се извршавају унутар 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()

Flow-повраћајући упит аутоматски емитује нове резултате при свакој промени података у Realm-у. Flow приступ се савршено уклапа са Compose: collectAsState() у ViewModel-у аутоматски прекомпонује UI без ручног ажурирања адаптера.

Realm на iOS-у: Swift SDK

Realm Swift SDK пружа нативно Swift API са подршком async/await, Combine Publishers и Swift Concurrency. Модели података се дефинишу као класе који насљеђују Object, са @Persisted за својства.

@ObservedRealmObject и @ObservedResults су Property Wrappers за SwiftUI који аутоматски прецртавају View при промени података.

Пример Realm Swift SDK

Property Wrapper @ObservedResults повезује Realm упит са приказом у SwiftUI-ју. При промени било којег задатка, SwiftUI аутоматски перекомпонује листу.

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("Додај задатак") {
            let realm = try! Realm()
            try! realm.write {
                realm.add(TaskItem(value: ["title": "New task"]))
            }
        }
    }
}

@ObservedResults аутоматски управља животним циклусом Realm упита: при креирању View-а ствара се претплата на промене, при уништавању отказује се. Property Wrapper прихвата опционални NSPredicate и сортирање.

Сценарији коришћења Realm-а

Офлајн апликације — Realm је идеалан за сценарије где подаци морају бити доступни без интернета. Уграђена синхронизација (Realm Sync са MongoDB Atlas) аутоматски решава конфликте при поновном повезивању.

Реактивни интерфејси — Live Objects и Flow/Combine обавештења чине Realm погодним избором за апликације са често ажурираним подацима.

Вишеплатформни пројекти — Realm подржава Kotlin Multiplatform, Flutter, React Native и Xamarin. Модел података се дефинише једном за све платформе.

Realm Sync: синхронизација кроз MongoDB Atlas

Realm Sync је облачка услуга уграђена у MongoDB Atlas. Апликација аутоматски синхронизује податке између уређаја корисника и сервера. Конфликти се решавају по стратегији last write wins.

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)
        // Аутоматска синхронизација је активна
    }
}

SyncConfiguration конфигурише везу са MongoDB Atlas-ом и одређује скуп синхронизованих модела. Након аутентификације корисника, Realm аутоматски учитава податке из облака и спаја их са локалним променама.

Често постављана питања

Да ли је Realm бесплатан за комерцијалну употребу?

Да, локална Realm база је потпуно бесплатна (Apache 2.0). Realm Sync кроз MongoDB Atlas је плаћена услуга. Бесплатни ниво Atlas-а нуди 500 MB и 1 милион операција месечно.

Може ли се мигрирати са SQLite-а на Realm?

Да, миграција је могућа кроз извоз података из SQLite-а у JSON и увоз у Realm.

Како Realm решава конфликте синхронизације?

Realm Sync по подешавању користи last write wins. За сложеније конфликте, конфигуришите прилагођене функције на серверу MongoDB Atlas-а.

Да ли Realm подржава агрегацијске упите?

Realm не подржава SQL агрегације. За аналитичке упите користите MongoDB Aggregation Pipeline.

Да ли су подаци у Realm-у безбедни?

Realm не шифрује податке по подешавању. За шифровање наведите 64-бајтни кључ у конфигурацији.

Закључак

  • Realm — објектно-оријентисана NoSQL база података са memory-mapped приступом, live objects и вишеплатформним моделом података.
  • Zero-copy архитектура омогућава директно читање података из memory-mapped датотеке.
  • Live Objects и @ObservedResults/Flow осигуравају аутоматско ажурирање UI-ја.
  • Realm Sync са MongoDB Atlas-ом пружа уграђену синхронизацију у облаку.
  • Вишеплатформни SDK подржавају Kotlin Multiplatform, Flutter, React Native.
  • За аналитичке упите Realm заостаје за SQLite-ом.
  • Препорука — користите Realm за офлајн апликације, SQLite/Room за аналитику.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође