Realm dalam aplikasi seluler: apa itu dan bagaimana cara kerjanya

Penulis: IT Sectr Diterbitkan: 2026-03-12 Waktu membaca: 11 mnt

Realm adalah database NoSQL berorientasi objek seluler yang dikembangkan sebagai alternatif untuk SQLite dan Core Data untuk iOS dan Android. Data disimpan dalam format khusus dengan akses langsung ke objek di memori, yang memastikan kecepatan baca dan tulis tinggi. Berkat notifikasi reaktif, sinkronisasi otomatis melalui Realm Sync, dan model data lintas platform, Realm digunakan di lebih dari 1 miliar perangkat (data MongoDB, 2025).

Poin Utama

  • Realm adalah database objek NoSQL untuk platform seluler dengan akses langsung ke data di memori operasional.
  • Live Objects objek Realm diperbarui secara otomatis saat data berubah tanpa pemuatan ulang manual.
  • Zero-copy data tidak disalin antar lapisan aplikasi, sehingga menghilangkan overhead ORM.
  • Realm Sync sinkronisasi bawaan antar perangkat melalui MongoDB Atlas Device Sync.
  • Lintas platform model data ditentukan sekali untuk iOS, Android, Flutter, dan React Native.

Apa itu Realm?

Realm adalah database berorientasi objek yang dibuat khusus untuk aplikasi seluler. Berbeda dengan SQLite, Realm tidak menggunakan SQL dan model relasional — data disimpan sebagai objek langsung (Live Objects) yang dapat diakses secara langsung tanpa lapisan ORM perantara. Pengembang bekerja dengan objek bahasa biasa (Swift, Kotlin, Dart) yang secara otomatis disimpan di database.

Realm muncul pada tahun 2014 sebagai startup Realm Inc., dan pada tahun 2019 diakuisisi oleh MongoDB Inc. Sejak itu, Realm dikembangkan sebagai MongoDB Realm — bagian dari platform terpadu Atlas Device Sync untuk sinkronisasi data seluler. Database lokal Realm tetap gratis dan terbuka (lisensi Apache 2.0), sedangkan Realm Sync (sinkronisasi cloud) didistribusikan melalui langganan.

Menurut MongoDB Developer Report (2025), Realm digunakan di 15% aplikasi seluler sebagai penyimpanan lokal utama. Skenario utama adalah aplikasi dengan mode offline, model objek kompleks, dan kebutuhan sinkronisasi antar perangkat, di mana Realm melampaui SQLite dalam kecepatan pengembangan dan kemudahan bekerja dengan objek.

Prinsip Realm

Live Objects setiap objek Realm terhubung ke disk melalui pemetaan memori (memory-mapped file). Perubahan objek di thread mana pun segera tercermin di semua thread lain tanpa pemberitahuan manual. Antarmuka UI secara otomatis digambar ulang saat data berubah melalui notifikasi Realm. Zero-copy Realm tidak menyalin data dari database ke objek, objek itu sendiri adalah data di memori.

Bagaimana Realm dibangun: arsitektur dan penyimpanan

Inti Realm ditulis dalam C++ dan menggunakan B+ Tree untuk mengindeks data. Berbeda dengan SQLite, di mana setiap baris adalah catatan dalam tabel relasional, Realm menyimpan objek sebagai simpul dalam struktur grafik dengan referensi langsung di antara mereka (forward pointers). Hubungan antar objek bukan foreign key, melainkan penunjuk langsung, yang menghilangkan kebutuhan akan operasi JOIN.

File Realm (ekstensi .realm) bersifat memory-mapped — OS sendiri mengelola pemuatan halaman file ke memori saat diakses. Hal ini memungkinkan Realm bekerja dengan database yang melebihi memori operasional yang tersedia dan memastikan latensi baca pada tingkat struktur data asli bahasa (Swift Array atau Kotlin List) untuk data yang muat di RAM.

Zero-copy dan Live Objects

File Memory-mapped adalah teknologi kunci Realm. Alih-alih menyalin data dari file database ke objek bahasa (seperti yang dilakukan SQLite melalui sqlite3_step + sqlite3_column_*), Realm memetakan file database langsung ke ruang alamat proses. Objek bahasa hanyalah penunjuk ke data di memori yang dipetakan. Mengubah objek mengubah database di disk tanpa panggilan save terpisah.

KarakteristikRealm (zero-copy)SQLite (penyalinan)
BacaAkses memori langsung (nanodetik)Penyalinan ke objek (mikrodetik)
TulisPenulisan langsung ke file memory-mappedsave() dengan transaksi SQL INSERT/UPDATE
HubunganPenunjuk langsung (forward pointers)Foreign key + JOIN
Konsumsi memoriFile + cache halaman OSObjek + cache halaman SQLite
Objek langsungYa (pembaruan otomatis)Tidak (perlu fetch baru)

Konsumsi memori Realm lebih tinggi saat pembacaan aktif (seluruh file atau sebagian besarnya dipetakan ke memori), tetapi lebih rendah saat operasi tulis, karena tidak diperlukan alokasi memori untuk salinan objek. Untuk database hingga 1 GB di perangkat seluler, pendekatan memory-mapped memberikan kinerja keseluruhan yang lebih baik daripada SQLite dengan penyalinan perantaranya.

Realm vs SQLite vs Core Data: perbandingan

SQLite adalah sistem manajemen database relasional dengan SQL dan transaksi ACID. Realm adalah database NoSQL berorientasi objek dengan akses memory-mapped. Core Data adalah lapisan ORM Apple di atas SQLite. Masing-masing dari tiga pendekatan memiliki area aplikasi dan kekuatannya sendiri. Realm unggul dalam kecepatan akses langsung ke objek dan reaktivitas, SQLite dalam universalitas dan kedewasaan, Core Data dalam integrasi dengan ekosistem Apple.

Kinerja Realm pada operasi baca 10-50% lebih tinggi dari SQLite berkat akses zero-copy. Pada operasi tulis, Realm juga lebih cepat karena tidak adanya analisis sintaks SQL dan perubahan langsung pada halaman memory-mapped. Namun, Realm dapat mengonsumsi lebih banyak memori operasional saat bekerja dengan database besar (>500 MB), karena file dipetakan sepenuhnya ke ruang alamat.

KriteriaRealmSQLiteCore Data
TipeDatabase objek NoSQLDBMS relasional (SQL)ORM di atas SQLite
Kecepatan bacaTinggi (zero-copy)SedangSedang (overhead ORM)
ReaktivitasLive Objects (bawaan)Perlu wrapper (Room/GRDB)NSFetchedResultsController
SinkronisasiRealm Sync (MongoDB Atlas)Perlu implementasi kustomNSPersistentCloudKitContainer
PlatformiOS, Android, Flutter, RN, Node.jsiOS, Android, Web, DesktopHanya iOS/macOS
Ukuran pustaka~4 MB~600 KBBawaan di SDK

Pilihan antara Realm dan SQLite sering kali tergantung pada prioritas: kecepatan pengembangan dan reaktivitas (Realm) versus kontrol dan universalitas (SQLite). Realm sangat baik untuk MVP dan prototipe, di mana model data sering berubah dan penting untuk mendapatkan pembaruan UI langsung dengan cepat. SQLite/Room lebih disukai untuk produk matang dengan volume data besar dan kueri analitis yang kompleks.

Realm di Android: Kotlin SDK

Realm Kotlin SDK adalah pustaka resmi untuk Android, ditulis dalam Kotlin (bukan pembungkus di atas Java SDK). Model data ditentukan melalui kelas yang mewarisi dari RealmObject, dengan anotasi @PrimaryKey untuk pengidentifikasi unik. Realm Kotlin mendukung Kotlin Coroutines, Flow, dan KSP (Kotlin Symbol Processing) untuk pembuatan kode waktu kompilasi.

RealmQuery menyediakan API type-safe untuk pemfilteran tanpa SQL. Kueri dibangun dengan rantai metode: queryfiltersortfind. Hasil dapat dikembalikan sebagai daftar (dengan pemuatan ke memori) atau sebagai Flow (stream reaktif yang diperbarui saat data berubah). Realm Kotlin juga mendukung objek bersarang dan daftar (RealmList).

Contoh Realm Kotlin SDK

Model data Realm didefinisikan sebagai data class yang mengimplementasikan antarmuka RealmObject. Bidang _id ditandai dengan @PrimaryKey untuk identifikasi unik. Relasi “satu-ke-banyak” diimplementasikan melalui RealmList — daftar RealmObject lainnya. Semua operasi tulis (create, update, delete) dilakukan di dalam blok transaksi 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()

Kueri yang mengembalikan Flow secara otomatis mengeluarkan hasil baru saat ada perubahan data di Realm: penambahan, pembaruan, atau penghapusan Project atau Task. Pendekatan Flow sangat cocok dengan Compose: collectAsState() di ViewModel secara otomatis mengomposisi ulang UI saat data berubah tanpa pembaruan manual adapter daftar atau penggunaan LiveData.

Realm di iOS: Swift SDK

Realm Swift SDK menyediakan API Swift asli dengan dukungan async/await, Combine Publishers, dan Swift Concurrency. Model data ditentukan sebagai kelas yang mewarisi dari Object, menggunakan @Persisted untuk properti. Realm Swift secara otomatis memperbarui objek saat perubahan, dan notifikasi (NotificationToken) memungkinkan berlangganan perubahan pada objek atau koleksi individual.

@ObservedRealmObject dan @ObservedResults adalah Property Wrapper untuk SwiftUI yang secara otomatis menggambar ulang View saat data Realm berubah. @ObservedResults bekerja dengan hasil kueri, @ObservedRealmObject dengan objek tertentu. Kedua properti membatalkan langganan saat View dideinisialisasi.

Contoh Realm Swift SDK

Integrasi SwiftUI Realm adalah salah satu kekuatan SDK. Property Wrapper @ObservedResults menghubungkan kueri Realm dengan tampilan di SwiftUI. Saat tugas berubah, SwiftUI secara otomatis mengomposisi ulang daftar. realm.writeAsync menjalankan transaksi di thread latar belakang tanpa memblokir UI.

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("Tambah Tugas") {
            let realm = try! Realm()
            try! realm.write {
                realm.add(TaskItem(value: ["title": "New task"]))
            }
        }
    }
}

@ObservedResults secara otomatis mengelola siklus hidup kueri Realm: saat View dibuat, langganan perubahan dibuat, saat dihancurkan, langganan dibatalkan. Property Wrapper menerima predikat opsional (NSPredicate) dan pengurutan. Ini menghilangkan kebutuhan untuk menulis kueri fetch secara manual, membuat ViewModel, dan berlangganan notifikasi Realm.

Skenario penggunaan Realm

Aplikasi offline Realm sangat ideal untuk skenario di mana data harus tersedia tanpa internet. Sinkronisasi bawaan (Realm Sync dengan MongoDB Atlas) secara otomatis menyelesaikan konflik saat terhubung ke jaringan. Aplikasi terus bekerja dengan data lokal, dan sinkronisasi latar belakang memperbaruinya saat koneksi tersedia.

Antarmuka reaktif Live Objects dan notifikasi Flow/Combine membuat Realm menjadi pilihan yang nyaman untuk aplikasi dengan data yang sering berubah: obrolan, umpan tugas, dokumen bersama. UI diperbarui secara otomatis saat data ditambahkan, diubah, atau dihapus tanpa panggilan manual reloadData atau invalidate.

Proyek lintas platform Realm mendukung Kotlin Multiplatform (KMP), Flutter, React Native, dan Xamarin. Model data ditentukan sekali dan digunakan di semua platform. Ini mengurangi duplikasi kode dan menjamin konsistensi skema data antara aplikasi iOS dan Android dengan logika bisnis bersama.

Realm Sync: sinkronisasi melalui MongoDB Atlas

Realm Sync adalah layanan cloud yang terintegrasi dalam MongoDB Atlas. Aplikasi secara otomatis menyinkronkan data antara perangkat pengguna dan server. Konflik diselesaikan dengan strategi “last write wins” atau melalui fungsi Conflict Resolution kustom di server. Realm Sync mendukung sinkronisasi parsial (subset data) untuk mengurangi lalu lintas.

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)
        // Sinkronisasi otomatis aktif
    }
}

SyncConfiguration mengonfigurasi koneksi ke MongoDB Atlas dan menentukan set model yang akan disinkronkan. Setelah autentikasi pengguna, Realm secara otomatis memuat data dari cloud dan menggabungkannya dengan perubahan lokal. Sinkronisasi bekerja di thread latar belakang dan tidak memerlukan panggilan manual — cukup buat instance Realm dengan SyncConfiguration.

Pertanyaan yang Sering Diajukan

Apakah Realm gratis untuk penggunaan komersial?

Ya, database lokal Realm sepenuhnya gratis (lisensi Apache 2.0). Realm Sync (sinkronisasi cloud) melalui MongoDB Atlas adalah layanan berbayar yang termasuk dalam langganan Atlas Device Sync. Untuk tingkat gratis Atlas, tersedia 500 MB data pertama dan 1 juta operasi per bulan.

Bisakah migrasi dari SQLite ke Realm dilakukan?

Ya, migrasi dimungkinkan melalui ekspor data dari SQLite ke JSON dan impor ke Realm pada pemuatan pertama aplikasi. Untuk volume besar, gunakan migrasi streaming: tulis data secara paralel ke kedua database sampai pengguna beralih ke versi baru aplikasi, lalu hapus file SQLite.

Bagaimana Realm menangani konflik sinkronisasi?

Realm Sync secara default menggunakan strategi “last write wins” — tulisan terakhir menimpa tulisan sebelumnya. Untuk konflik kompleks, konfigurasikan fungsi Conflict Resolution kustom di server MongoDB Atlas yang menggabungkan perubahan dari perangkat berbeda berdasarkan logika bisnis aplikasi (misalnya, menggabungkan nilai alih-alih mengganti).

Apakah Realm mendukung kueri agregasi?

Realm tidak mendukung agregasi SQL (SUM, AVG, GROUP BY) di tingkat database. Untuk kueri analitis, disarankan untuk mengekspor data dari Realm ke MongoDB Atlas melalui Realm Sync dan melakukan agregasi melalui MongoDB Aggregation Pipeline. Untuk penghitungan sederhana, gunakan realm.query<T>().count().

Apakah data di Realm aman?

Realm tidak mengenkripsi data secara default. Untuk enkripsi, tentukan kunci 64-byte dalam konfigurasi: Realm.Configuration(encryptionKey: key). Enkripsi menggunakan AES-256 + SHA-2 HMAC dan meningkatkan overhead operasi sebesar 10-20%. Tanpa enkripsi, file .realm dapat dibaca oleh proses apa pun yang memiliki akses ke sistem file.

Ringkasan

  • Realm adalah database NoSQL berorientasi objek dengan akses memory-mapped, live objects, dan model data lintas platform untuk aplikasi seluler.
  • Arsitektur Zero-copy memungkinkan pembacaan data langsung dari file memory-mapped tanpa menyalin ke objek bahasa, membuat Realm 10-50% lebih cepat dari SQLite dalam pembacaan.
  • Live Objects dan @ObservedResults (SwiftUI) / Flow (Kotlin) memastikan pembaruan UI otomatis saat data berubah tanpa kueri database manual.
  • Realm Sync dengan MongoDB Atlas menyediakan sinkronisasi cloud bawaan dengan penyelesaian konflik strategi “last write wins”.
  • SDK lintas platform mendukung Kotlin Multiplatform, Flutter, React Native — model data ditentukan sekali untuk semua platform.
  • Untuk kueri analitis Realm lebih lemah dari SQLite karena tidak adanya agregasi grup — laporan kompleks dilakukan melalui MongoDB Aggregation Pipeline.
  • Rekomendasi gunakan Realm untuk aplikasi offline dengan pembaruan UI yang sering dan kebutuhan sinkronisasi lintas platform, SQLite/Room untuk proyek dengan analitik dan kumpulan data yang stabil.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga