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 — 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.
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 ö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.
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ət | Realm (zero-copy) | SQLite (kopyalama) |
|---|---|---|
| Oxuma | Birbaşa yaddaşa giriş (nanosaniyələr) | Obyektə kopyalama (mikrosaniyələr) |
| Yazma | Memory-mapped fayla dərhal yazma | SQL INSERT/UPDATE transaksiyası ilə save() |
| Əlaqələr | Birbaşa göstəricilər (forward pointers) | Foreign key + JOIN |
| Yaddaş istehlakı | Fayl + Ə səhifə keşi | Obyektlər + SQLite səhifə keşi |
| Canlı obyektlər | Bə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.
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.
| Meyar | Realm | SQLite | Core Data |
|---|---|---|---|
| Tip | NoSQL obyekt ITİ | Relyasiya ITİ (SQL) | SQLite üzərində ORM |
| Oxuma sürəti | Yüksək (zero-copy) | Orta | Orta (ORM yükü) |
| Reaktivlik | Live Objects (daxili) | Sarğıcı tələb olunur (Room/GRDB) | NSFetchedResultsController |
| Sinxronizasiya | Realm Sync (MongoDB Atlas) | Şəxsi tətbiq tələb olunur | NSPersistentCloudKitContainer |
| Platformalar | iOS, Android, Flutter, RN, Node.js | iOS, Android, Web, Desktop | Yalnız iOS/macOS |
| Kitabxana ölçüsü | ~4 MB | ~600 KB | SDK-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.
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: query → filter → sort → find. 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.
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.
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.
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 və @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-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.
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.
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-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.
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
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.
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 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 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<T>().count() istifadə edin.
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
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.
Həm də oxuyun