Mobil tətbiqlərdə Realm: bu nədir və necə işləyir

Müəllif: IT Sectr Dərc olunub: 2026-03-12 Oxuma vaxtı: 11 dəq

Realm — iOS və Android üçün SQLite və Core Data-ya alternativ olaraq hazırlanmış mobil obyekt-yönümlü NoSQL verilənlər bazasıdır. Məlumatlar öz formatında saxlanılır və yaddaşdakı obyektlərə birbaşa çıxış təmin edir ki, bu da yüksək oxuma və yazma sürətini təmin edir. Reaktiv bildirişlər, Realm Sync vasitəsilə avtomatik sinxronizasiya və platformalararası verilən modeli sayəsində Realm 1 milyarddan çox cihazda istifadə olunur (MongoDB məlumatları, 2025).

Başlıca

  • Realm — mobil platformalar üçün operativ yaddaşda məlumatlara birbaşa çıxışı olan NoSQL obyekt verilənlər bazasıdır.
  • Live Objects — Realm obyektləri məlumat dəyişikliyində əl ilə yenidən yükləmə tələb etmədən avtomatik yenilənir.
  • Zero-copy — məlumatlar tətbiq təbəqələri arasında kopyalanmır və ORM yükünü aradan qaldırır.
  • Realm Sync — MongoDB Atlas Device Sync vasitəsilə cihazlar arasında daxili sinxronizasiya.
  • Platformalararası — verilən modeli iOS, Android, Flutter və React Native üçün bir dəfə müəyyən edilir.

Realm nədir?

Realm — xüsusi olaraq mobil tətbiqlər üçün yaradılmış obyekt-yönümlü verilənlər bazasıdır. SQLite-dən fərqli olaraq, Realm SQL və relyasiya modelindən istifadə etmir — məlumatlar canlı obyektlər (Live Objects) kimi saxlanılır və onlara giriş aralıq ORM təbəqəsi olmadan birbaşa həyata keçirilir. Tərtibatçı avtomatik olaraq verilənlər bazasında saxlanılan adi dil obyektləri (Swift, Kotlin, Dart) ilə işləyir.

Realm 2014-cü ildə Realm Inc. startapı kimi meydana çıxdı və 2019-cu ildə MongoDB Inc. tərəfindən satın alındı. O vaxtdan Realm MongoDB Realm — mobil verilən sinxronizasiyası üçün vahid Atlas Device Sync platformasının bir hissəsi kimi inkişaf edir. Əsas lokal Realm verilənlər bazası pulsuz və açıq qalır (Apache 2.0 lisenziyası), Realm Sync (bulud sinxronizasiyası) isə abunə əsasında yayılır.

MongoDB Developer Report-a (2025) görə, Realm mobil tətbiqlərin 15%-də əsas lokal yaddaş kimi istifadə olunur. Əsas ssenarilər — oflayn rejimli, mürəkkəb obyekt modelləri olan və cihazlar arasında sinxronizasiyaya ehtiyac duyan tətbiqlərdir. Burada Realm SQLite-dən inkişaf sürəti və obyektlərlə işləmə rahatlığı ilə üstündür.

Realm prinsipləri

Live Objects — hər bir Realm obyekti yaddaş xəritələmə (memory-mapped file) vasitəsilə disklə əlaqələndirilir. İstənilən axındakı obyekt dəyişikliyi digər bütün axınlarda əl ilə bildiriş vermədən dərhal əks olunur. UI interfeysi Realm bildirişləri vasitəsilə məlumat dəyişikliyində avtomatik yenidən çizilir. Zero-copy — Realm verilənləri bazadan obyektlərə kopyalamır, obyektlər özləri yaddaşdakı məlumatlardır.

Realm necə qurulub: arxitektura və saxlama

Realm özəyi C++ dilində yazılıb və verilənlərin indeksləşməsi üçün B+ Tree istifadə edir. Hər sətirin relyasiya cədvəlində qeyd olduğu SQLite-dən fərqli olaraq, Realm obyektləri arasında birbaşa istinadları (forward pointers) olan qraf quruluşundakı düymlər kimi saxlayır. Obyektlər arasındakı əlaqələr xarici açarlar deyil, birbaşa göstəricilərdir və bu, JOIN əməliyyatlarına ehtiyacı aradan qaldırır.

Realm faylları (.realm uzantısı) memory-mapped — əməliyyat sistemi özü giriş zamanı fayl səhifələrinin yaddaşa yüklənməsini idarə edir. Bu, Realm-ə mövcud operativ yaddaşı üstələyən verilənlər bazaları ilə işləməyə və RAM-a sığan məlumatlar üçün dilin yerli məlumat strukturları (Swift Array və ya Kotlin List) səviyyəsində oxuma gecikməsi təmin etməyə imkan verir.

Zero-copy və Live Objects

Pliki memory-mapped — Realm-in əsas texnologiyası. Məlumatları verilənlər bazası faylından dil obyektlərinə kopyalamaq əvəzinə (SQLite-in sqlite3_step + sqlite3_column_* ilə etdiyi kimi), Realm baza faylını birbaşa prosesin ünvan məkanına xəritələyir. Dil obyektləri sadəcə xəritələnmiş yaddaşdakı məlumatlara göstəricilərdir. Obyektin dəyişməsi ayrıca save çağırışı olmadan diskdəki bazanı dəyişir.

XüsusiyyətRealm (zero-copy)SQLite (kopyalama)
OxumaBirbaşa yaddaşa giriş (nanosaniyələr)Obyektə kopyalama (mikrosaniyələr)
YazmaMemory-mapped fayla dərhal yazmaSQL INSERT/UPDATE transaksiyası ilə save()
ƏlaqələrBirbaşa göstəricilər (forward pointers)Foreign key + JOIN
Yaddaş istehlakıFayl + Ə səhifə keşiObyektlər + SQLite səhifə keşi
Canlı obyektlərBəli (avtomatik yenilənmə)Xeyr (yeni fetch tələb olunur)

Yaddaş istehlakı Realm aktiv oxuma zamanı daha yüksəkdir (bütün fayl və ya onun böyük hissəsi yaddaşa xəritələnir), lakin yazma əməliyyatlarında daha aşağıdır, çünki obyekt nüsxələri üçün yaddaş ayırma tələb olunmur. Mobil cihazlarda 1 GB-a qədər olan bazalar üçün memory-mapped yanaşması aralıq kopyalama ilə SQLite-dən daha yaxşı ümumi performans verir.

Realm vs SQLite vs Core Data: müqayisə

SQLite — SQL və ACID transaksiyaları ilə relyasiya ITİ. Realm — memory-mapped girişli obyekt NoSQL verilənlər bazası. Core Data — SQLite üzərində Apple ORM təbəqəsi. Hər üç yanaşmanın öz tətbiq sahəsi və güclü tərəfləri var. Realm obyektlərə birbaşa giriş sürəti və reaktivlikdə üstündür, SQLite — universallıq və yetkinlikdə, Core Data — Apple ekosisteminə inteqrasiyada.

Realm-in oxuma əməliyyatlarında performansı zero-copy girişi sayəsində SQLite-dən 10-50% yüksəkdir. Yazma əməliyyatlarında Realm daha sürətlidir, çünki SQL sintaktik təhlilin olmaması və memory-mapped səhifələrin birbaşa dəyişdirilməsi sayəsində. Lakin Realm böyük verilənlər bazaları ilə (>500 MB) işlərkən daha çox operativ yaddaş istehlak edə bilər, çünki fayl tamamilə ünvan məkanına xəritələnir.

MeyarRealmSQLiteCore Data
TipNoSQL obyekt ITİRelyasiya ITİ (SQL)SQLite üzərində ORM
Oxuma sürətiYüksək (zero-copy)OrtaOrta (ORM yükü)
ReaktivlikLive Objects (daxili)Sarğıcı tələb olunur (Room/GRDB)NSFetchedResultsController
SinxronizasiyaRealm Sync (MongoDB Atlas)Şəxsi tətbiq tələb olunurNSPersistentCloudKitContainer
PlatformalariOS, Android, Flutter, RN, Node.jsiOS, Android, Web, DesktopYalnız iOS/macOS
Kitabxana ölçüsü~4 MB~600 KBSDK-ya daxildir

Seçim Realm və SQLite arasında çox vaxt prioritetlərə əsaslanır: inkişaf sürəti və reaktivlik (Realm) əleyhinə nəzarət və universallıq (SQLite). Realm xüsusilə MVP və prototiplər üçün yaxşıdır, burada verilən modeli tez-tez dəyişir və canlı UI yenilənmələrini tez almaq vacibdir. SQLite/Room böyük verilən həcmləri və mürəkkəb analitik sorğuları olan yetkin məhsullar üçün üstünlük verilir.

Android-də Realm: Kotlin SDK

Realm Kotlin SDK — Kotlin dilində yazılmış Android üçün rəsmi kitabxana (Java SDK üzərində sarğıcı deyil). Verilən modeli RealmObject-dən miras alan siniflər vasitəsilə müəyyən edilir, unikal identifikator üçün @PrimaryKey annotasiyası ilə. Realm Kotlin Kotlin Coroutines, Flow və KSP (Kotlin Symbol Processing) dəstəkləyir.

RealmQuery SQL olmadan filtrləmə üçün type-safe API təqdim edir. Sorğular metodlar zəncirində qurulur: queryfiltersortfind. Nəticə siyahı kimi (yaddaşa yükləmə ilə) və ya Flow kimi (verilən dəyişikliyində yenilənən reaktiv axın) qaytarıla bilər. Realm Kotlin həmçinin iç-içə obyektləri və siyahıları (RealmList) dəstəkləyir.

Realm Kotlin SDK nümunəsi

Verilən modeli Realm RealmObject interfeysini tətbiq edən data class kimi müəyyən edilir. _id sahəsi unikal identifikasiya üçün @PrimaryKey ilə qeyd olunur. Birçoxa əlaqəsi RealmList vasitəsilə həyata keçirilir. Bütün yazma əməliyyatları (create, update, delete) write transaksiya bloku daxilində yerinə yetirilir.

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 qaytaran sorğu Realm-dəki hər hansı verilən dəyişikliyində avtomatik olaraq yeni nəticələr göndərir: Project və ya Task-ın əlavə edilməsi, yenilənməsi və ya silinməsi. Flow yanaşması Compose ilə ideal şəkildə uyğunlaşır: ViewModel-dəki collectAsState() siyahı adapterlərini və ya LiveData-nı əl ilə yeniləmədən məlumat dəyişikliyində UI-nı avtomatik olaraq yenidən qurur.

iOS-da Realm: Swift SDK

Realm Swift SDK async/await, Combine Publishers və Swift Concurrency dəstəyi ilə yerli Swift API təqdim edir. Verilən modelləri Object-dən miras alan siniflər kimi müəyyən edilir, xüsusiyyətlər üçün @Persisted istifadə olunur. Realm Swift dəyişikliklərdə obyektləri avtomatik yeniləyir və bildirişlər (NotificationToken) ayrı-ayrı obyektlərdəki və ya kolleksiyalardakı dəyişikliklərə abunə olmağa imkan verir.

@ObservedRealmObject@ObservedResults — SwiftUI üçün Property Wrappers, Realm məlumatları dəyişikliyində View-i avtomatik yenidən çəkir. @ObservedResults sorğu nəticələri ilə işləyir, @ObservedRealmObject isə konkret obyektlə. Hər iki xüsusiyyət View deinitialization zamanı abunəni ləğv edir.

Realm Swift SDK nümunəsi

Realm-in SwiftUI ilə inteqrasiyası — SDK-nın güclü tərəflərindən biridir. @ObservedResults Property Wrapper-ı Realm sorğunu SwiftUI-də göstərmə ilə əlaqələndirir. Hər hansı tapşırıq dəyişikliyində SwiftUI siyahını avtomatik yenidən qurur. realm.writeAsync UI-nı bloklamadan fon axınında transaksiyaları yerinə yetirir.

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("Tapşırıq əlavə et") {
            let realm = try! Realm()
            try! realm.write {
                realm.add(TaskItem(value: ["title": "New task"]))
            }
        }
    }
}

@ObservedResults Realm sorğunun həyat dövrünü avtomatik idarə edir: View yaradılanda dəyişikliklərə abunə yaradılır, məhv olanda ləğv edilir. Property Wrapper isteğə bağlı predikat (NSPredicate) və sıralama qəbul edir. Bu, əl ilə fetch sorğları yazmaq, ViewModel yaratmaq və Realm bildirişlərinə abunə olmaq ehtiyacını aradan qaldırır.

Realm istifadə ssenariləri

Oflayn tətbiqlər — Realm məlumatların internet olmadan əlçatan olmalı olduğu ssenarilər üçün idealdır. Daxili sinxronizasiya (MongoDB Atlas ilə Realm Sync) şəbəkəyə qoşulduqda avtomatik olaraq konfliktləri həll edir. Tətbiq yerli məlumatlarla işləməyə davam edir, fon sinxronizasiyası isə əlaqə yarandıqda onları yeniləyir.

Reaktiv interfeyslər — Live Objects və Flow/Combine bildirişləri Realm-i tez-tez yenilənən məlumatları olan tətbiqlər üçün rahat seçim edir: söhbətlər, tapşırıq lentləri, birgə sənədlər. UI əl ilə reloadData və ya invalidate çağırmadan məlumat əlavə ediləndə, dəyişdiriləndə və ya silinəndə avtomatik yenilənir.

Platformalararası layihələr — Realm Kotlin Multiplatform (KMP), Flutter, React Native və Xamarin dəstəkləyir. Verilən modeli bir dəfə müəyyən edilir və bütün platformalarda istifadə olunur. Bu, kod təkrarlanmasını azaldır və ümumi biznes məntiqi ilə iOS və Android tətbiqləri arasında verilən sxeminin uyğunluğunu təmin edir.

Realm Sync: MongoDB Atlas vasitəsilə sinxronizasiya

Realm Sync — MongoDB Atlas-a daxil edilmiş bulud xidməti. Tətbiq istifadəçinin cihazları ilə server arasında məlumatları avtomatik sinxronlaşdırır. Konfliktlər „last write wins“ strategiyası və ya serverdəki fərdi Conflict Resolution Functions vasitəsilə həll edilir. Realm Sync trafiki azaltmaq üçün qismən sinxronizasiyanı (subset of data) dəstəkləyir.

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)
        // Avtomatik sinxronizasiya aktivdir
    }
}

SyncConfiguration MongoDB Atlas-a qoşulmanı konfiqurasiya edir və sinxronlaşdırılan modellər dəstini müəyyən edir. İstifadəçinin autentifikasiyasından sonra Realm avtomatik olaraq buluddan məlumatları yükləyir və onları yerli dəyişikliklərlə birləşdirir. Sinxronizasiya fon axınında işləyir və əl ilə harış tələb etmir — sadəcə SyncConfiguration ilə Realm nümunəsi yaratmaq kifayətdir.

Tez-tez verilən suallar

Realm kommersiya istifadəsi üçün ödənişsizdir?

Bəli, yerli Realm verilənlər bazası tamamilə ödənişsizdir (Apache 2.0 lisenziyası). Realm Sync (bulud sinxronizasiyası) MongoDB Atlas vasitəsilə Atlas Device Sync abunəsinə daxil olan ödənişli xidmətdir. Atlas-ın pulsuz səviyyəsi ilk 500 MB məlumat və ayda 1 milyon əməliyyat təklif edir.

SQLite-dən Realm-ə miqrasiya etmək olarmı?

Bəli, miqrasiya SQLite-dən verilənlərin JSON-a ixracı və tətbiqin ilk yüklənməsində Realm-ə idxalı ilə mümkündür. Böyük həcmlər üçün axın miqrasiyasından istifadə edin: istifadəçilər tətbiqin yeni versiyasına keçənə qədər paralel olaraq hər iki verilənlər bazasına məlumat yazın, sonra SQLite faylını silin.

Realm sinxronizasiya konfliktlərini necə həll edir?

Realm Sync susmaya görə „last write wins“ strategiyasını istifadə edir — son yazma əvvəlki üzərindən yazır. Mürəkkəb konfliktlər üçün MongoDB Atlas serverində müxtəlif cihazlardan dəyişiklikləri tətbiqin biznes məntiqinə uyğun birləşdirən fərdi Conflict Resolution Functions konfiqurasiya edin (əvəz etmə əvəzinə dəyərləri birləşdirmək kimi).

Realm aqreqasiya sorğularını dəstəkləyir?

Realm verilənlər bazası səviyyəsində SQL aqreqasiyalarını (SUM, AVG, GROUP BY) dəstəkləmir. Analitik sorğular üçün məlumatları Realm Sync vasitəsilə Realm-dən MongoDB Atlas-a ixrac etmək və MongoDB Aggregation Pipeline vasitəsilə aqreqasiyaları yerinə yetirmək tövsiyə olunur. Sadə hesablamalar üçün realm.query&lt;T&gt;().count() istifadə edin.

Realm-dəki məlumatlar təhlükəsizdirmi?

Realm susmaya görə məlumatları şifrələmir. Şifrələmə üçün konfiqurasiyada 64 baytlıq açar təyin edin: Realm.Configuration(encryptionKey: key). Şifrələmə AES-256 + SHA-2 HMAC istifadə edir və əməliyyatlara 10-20% yük əlavə edir. Şifrələmə olmadan .realm faylı fayl sisteminə girişi olan istənilən proses tərəfindən oxuna bilər.

Nəticələr

  • Realm — mobil tətbiqlər üçün memory-mapped girişi, live objects və platformalararası verilən modeli olan obyekt-yönümlü NoSQL verilənlər bazasıdır.
  • Zero-copy arxitekturası məlumatları dil obyektlərinə kopyalamadan birbaşa memory-mapped fayldan oxumağa imkan verir və Realm-i oxumada SQLite-dən 10-50% sürətli edir.
  • Live Objects və @ObservedResults (SwiftUI) / Flow (Kotlin) əl ilə verilənlər bazası sorğuları olmadan məlumat dəyişikliyində UI-nın avtomatik yenilənməsini təmin edir.
  • Realm Sync MongoDB Atlas ilə „last write wins“ strategiyası üzrə konflikt həlli ilə daxili bulud sinxronizasiyası təmin edir.
  • Platformalararası SDK Kotlin Multiplatform, Flutter, React Native dəstəkləyir — verilən modeli bütün platformalar üçün bir dəfə müəyyən edilir.
  • Analitik sorğular üçün Realm qrup aqreqasiyalarının olmaması səbəbindən SQLite-dən geri qalır — mürəkkəb hesabatlar MongoDB Aggregation Pipeline vasitəsilə yerinə yetirilir.
  • Tövsiyə — Realm-i tez-tez UI yenilənmələri və platformalararası sinxronizasiya ehtiyacı olan oflayn tətbiqlər üçün, SQLite/Room-u isə analitika və sabit verilən dəstləri olan layihələr üçün istifadə edin.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun