Realm sa mga mobile app: ano ito at paano ito gumagana

May-akda: IT Sectr Nai-publish: 2026-03-12 Oras ng pagbabasa: 11 min

Ang Realm ay isang mobile object-oriented NoSQL database na binuo bilang alternatibo sa SQLite at Core Data para sa iOS at Android. Ang data ay naka-imbak sa sariling format na may direktang access sa mga object sa memorya, na tinitiyak ang mataas na bilis ng pagbasa at pagsulat. Dahil sa mga reactive na notification, awtomatikong pag-sync sa pamamagitan ng Realm Sync, at cross-platform na modelo ng data, ang Realm ay ginagamit sa mahigit 1 bilyong device (data ng MongoDB, 2025).

Mga Pangunahing Punto

  • Realm ay isang NoSQL object database para sa mga mobile platform na may direktang access sa data sa operational memory.
  • Live Objects ang mga object ng Realm ay awtomatikong nag-a-update kapag nagbago ang data nang walang manu-manong pag-reload.
  • Zero-copy ang data ay hindi kinokopya sa pagitan ng mga layer ng application, na nag-aalis ng overhead ng ORM.
  • Realm Sync built-in na pag-sync sa pagitan ng mga device sa pamamagitan ng MongoDB Atlas Device Sync.
  • Cross-platform ang modelo ng data ay tinutukoy nang isang beses para sa iOS, Android, Flutter, at React Native.

Ano ang Realm?

Realm ay isang object-oriented database na espesyal na ginawa para sa mga mobile application. Hindi tulad ng SQLite, hindi gumagamit ang Realm ng SQL at relational na modelo — ang data ay naka-imbak bilang mga live na object (Live Objects) na direktang maa-access nang walang intermediary ORM layer. Ang developer ay gumagana sa mga ordinaryong object ng wika (Swift, Kotlin, Dart) na awtomatikong nai-save sa database.

Ang Realm ay lumitaw noong 2014 bilang isang startup na Realm Inc., at noong 2019 ay nakuha ng MongoDB Inc. Mula noon, ang Realm ay binuo bilang MongoDB Realm — bahagi ng pinag-isang Atlas Device Sync platform para sa mobile data synchronization. Ang lokal na Realm database ay nananatiling libre at open-source (lisensyang Apache 2.0), habang ang Realm Sync (cloud synchronization) ay ipinamamahagi sa pamamagitan ng subscription.

Ayon sa MongoDB Developer Report (2025), ang Realm ay ginagamit sa 15% ng mga mobile application bilang pangunahing lokal na imbakan. Ang mga pangunahing sitwasyon ay mga application na may offline mode, kumplikadong object model, at pangangailangan para sa pag-sync sa pagitan ng mga device, kung saan nahihigitan ng Realm ang SQLite sa bilis ng pag-develop at kadalian ng pagtatrabaho sa mga object.

Mga Prinsipyo ng Realm

Live Objects bawat object ng Realm ay konektado sa disk sa pamamagitan ng memory-mapped file. Ang pagbabago ng object sa anumang thread ay agad na naaaninag sa lahat ng iba pang thread nang walang manu-manong abiso. Ang UI ay awtomatikong nagre-redraw kapag nagbago ang data sa pamamagitan ng Realm notification. Zero-copy hindi kinokopya ng Realm ang data mula sa database papunta sa mga object, ang mga object mismo ay ang data sa memorya.

Paano binuo ang Realm: arkitektura at imbakan

Ang core ng Realm ay nakasulat sa C++ at gumagamit ng B+ Tree para sa pag-index ng data. Hindi tulad ng SQLite, kung saan ang bawat row ay isang record sa isang relational table, iniimbak ng Realm ang mga object bilang mga node sa isang graph structure na may direktang mga reference sa pagitan nila (forward pointers). Ang mga ugnayan sa pagitan ng mga object ay hindi foreign keys, kundi mga direktang pointer, na nag-aalis ng pangangailangan para sa JOIN operations.

Ang mga file ng Realm (.realm extension) ay memory-mapped — ang OS mismo ang namamahala sa pag-load ng mga page ng file sa memorya habang ina-access. Ito ay nagpapahintulot sa Realm na gumana sa mga database na lampas sa available na RAM at tinitiyak ang read latency sa antas ng native data structures ng wika (Swift Array o Kotlin List) para sa data na kasya sa RAM.

Zero-copy at Live Objects

Memory-mapped files ay ang pangunahing teknolohiya ng Realm. Sa halip na kopyahin ang data mula sa database file patungo sa mga language object (gaya ng ginagawa ng SQLite sa pamamagitan ng sqlite3_step + sqlite3_column_*), minamapa ng Realm ang database file nang direkta sa address space ng process. Ang mga language object ay mga pointer lamang sa data sa naka-map na memorya. Ang pagbabago ng isang object ay nagbabago sa database sa disk nang walang hiwalay na save call.

KatangianRealm (zero-copy)SQLite (pagkopya)
PagbasaDirektang access sa memorya (nanoseconds)Pagkopya sa object (microseconds)
PagsulatAgad na pagsulat sa memory-mapped filesave() na may SQL INSERT/UPDATE transaction
Mga ugnayanDirektang pointer (forward pointers)Foreign key + JOIN
Pagkonsumo ng memoryaFile + page cache ng OSMga object + page cache ng SQLite
Live na mga objectOo (awtomatikong update)Hindi (kailangan ng bagong fetch)

Ang pagkonsumo ng memorya ng Realm ay mas mataas sa aktibong pagbasa (ang buong file o malaking bahagi nito ay naka-map sa memorya), ngunit mas mababa sa mga write operation, dahil hindi kailangan ng memory allocation para sa mga kopya ng object. Para sa mga database hanggang 1 GB sa mga mobile device, ang memory-mapped approach ay nagbibigay ng mas mahusay na pangkalahatang performance kaysa sa SQLite na may intermediate copying nito.

Realm vs SQLite vs Core Data: paghahambing

SQLite ay isang relational database management system na may SQL at ACID transactions. Ang Realm ay isang object NoSQL database na may memory-mapped access. Ang Core Data ay isang Apple ORM layer sa ibabaw ng SQLite. Bawat isa sa tatlong approach ay may sariling lugar ng aplikasyon at mga kalakasan. Nananalo ang Realm sa bilis ng direktang access sa object at reaktibiti, ang SQLite sa universality at kapanahunan, ang Core Data sa integrasyon sa Apple ecosystem.

Ang performance ng Realm sa read operations ay 10-50% mas mataas kaysa SQLite dahil sa zero-copy access. Sa write operations, mas mabilis din ang Realm dahil sa kawalan ng SQL syntax parsing at direktang pagbabago ng memory-mapped pages. Gayunpaman, ang Realm ay maaaring kumonsumo ng mas maraming RAM kapag nagtatrabaho sa malalaking database (>500 MB), dahil ang file ay ganap na naka-map sa address space.

KrayteryaRealmSQLiteCore Data
UriNoSQL object databaseRelational DBMS (SQL)ORM sa ibabaw ng SQLite
Bilis ng pagbasaMataas (zero-copy)KatamtamanKatamtaman (ORM overhead)
ReaktibitiLive Objects (built-in)Kailangan ng wrapper (Room/GRDB)NSFetchedResultsController
Pag-syncRealm Sync (MongoDB Atlas)Kailangan ng custom implementationNSPersistentCloudKitContainer
Mga platformiOS, Android, Flutter, RN, Node.jsiOS, Android, Web, DesktopiOS/macOS lang
Laki ng library~4 MB~600 KBBuilt-in sa SDK

Ang pagpili sa pagitan ng Realm at SQLite ay madalas na nakadepende sa mga priyoridad: bilis ng pag-develop at reaktibiti (Realm) laban sa kontrol at universality (SQLite). Ang Realm ay lalong mabuti para sa MVP at prototypes, kung saan ang modelo ng data ay madalas nagbabago at mahalaga ang mabilis na pagkuha ng live na UI updates. Ang SQLite/Room ay mas gusto para sa mga mature na produkto na may malalaking volume ng data at kumplikadong analytical queries.

Realm sa Android: Kotlin SDK

Realm Kotlin SDK ay ang opisyal na library para sa Android, na nakasulat sa Kotlin (hindi wrapper sa ibabaw ng Java SDK). Ang modelo ng data ay tinutukoy sa pamamagitan ng mga klase na nagmana mula sa RealmObject, na may annotation na @PrimaryKey para sa natatanging identifier. Sinusuportahan ng Realm Kotlin ang Kotlin Coroutines, Flow, at KSP (Kotlin Symbol Processing) para sa compile-time code generation.

RealmQuery ay nagbibigay ng type-safe API para sa pag-filter nang walang SQL. Ang mga query ay binuo sa pamamagitan ng method chaining: queryfiltersortfind. Ang resulta ay maaaring ibalik bilang listahan (na may pag-load sa memorya) o bilang Flow (reactive stream na nag-a-update kapag nagbago ang data). Sinusuportahan din ng Realm Kotlin ang mga nested object at listahan (RealmList).

Halimbawa ng Realm Kotlin SDK

Ang modelo ng data ng Realm ay tinutukoy bilang data class na nag-i-implement ng RealmObject interface. Ang field na _id ay minarkahan ng @PrimaryKey para sa natatanging identification. Ang relasyong “isahan-sa-marami” ay ipinapatupad sa pamamagitan ng RealmList — isang listahan ng iba pang RealmObject. Lahat ng write operations (create, update, delete) ay isinasagawa sa loob ng write transaction block.

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()

Isang Flow-returning query ay awtomatikong naglalabas ng mga bagong resulta sa bawat pagbabago ng data sa Realm: pagdaragdag, pag-update, o pagtanggal ng Project o Task. Ang Flow approach ay perpektong pinagsama sa Compose: ang collectAsState() sa ViewModel ay awtomatikong nag-recompose ng UI kapag nagbago ang data nang walang manu-manong pag-update ng list adapter o paggamit ng LiveData.

Realm sa iOS: Swift SDK

Realm Swift SDK ay nagbibigay ng native Swift API na may suporta para sa async/await, Combine Publishers, at Swift Concurrency. Ang mga modelo ng data ay tinutukoy bilang mga klase na nagmana mula sa Object, gamit ang @Persisted para sa mga property. Awtomatikong nag-a-update ang Realm Swift ng mga object kapag may mga pagbabago, at ang mga notification (NotificationToken) ay nagpapahintulot ng pag-subscribe sa mga pagbabago ng indibidwal na object o koleksyon.

@ObservedRealmObject at @ObservedResults ay Property Wrappers para sa SwiftUI na awtomatikong nagre-redraw ng View kapag nagbago ang data ng Realm. Ang @ObservedResults ay gumagana sa mga resulta ng query, ang @ObservedRealmObject ay gumagana sa isang partikular na object. Ang parehong property ay nagka-cancel ng subscription kapag na-deinitialize ang View.

Halimbawa ng Realm Swift SDK

SwiftUI integration ng Realm ay isa sa mga kalakasan ng SDK. Ang Property Wrapper na @ObservedResults ay nag-uugnay ng Realm query sa display sa SwiftUI. Kapag nagbago ang anumang gawain, awtomatikong nagre-recompose ang SwiftUI ng listahan. Ang realm.writeAsync ay nagsasagawa ng mga transaction sa background thread nang hindi hinaharangan ang 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("Magdagdag ng Gawain") {
            let realm = try! Realm()
            try! realm.write {
                realm.add(TaskItem(value: ["title": "New task"]))
            }
        }
    }
}

@ObservedResults ay awtomatikong namamahala sa lifecycle ng Realm query: kapag ginawa ang View, isang subscription sa mga pagbabago ay nilikha, kapag nawasak, ito ay kinakansela. Ang Property Wrapper ay tumatanggap ng opsyonal na predicate (NSPredicate) at sorting. Tinatanggal nito ang pangangailangan na manu-manong sumulat ng fetch query, lumikha ng ViewModel, at mag-subscribe sa Realm notification.

Mga sitwasyon ng paggamit ng Realm

Offline na application Ang Realm ay perpekto para sa mga sitwasyon kung saan ang data ay dapat na available nang walang internet. Ang built-in na pag-sync (Realm Sync sa MongoDB Atlas) ay awtomatikong nireso ang mga conflict kapag kumonekta sa network. Ang application ay patuloy na gumagana sa lokal na data, at ang background sync ay nag-a-update nito kapag may koneksyon.

Reactive na interface Ang Live Objects at Flow/Combine notification ay ginagawang magandang pagpipilian ang Realm para sa mga application na may madalas na nagbabagong data: mga chat, task feed, shared documents. Ang UI ay awtomatikong nag-a-update kapag ang data ay idinagdag, binago, o tinanggal nang walang manu-manong tawag sa reloadData o invalidate.

Cross-platform na proyekto Sinusuportahan ng Realm ang Kotlin Multiplatform (KMP), Flutter, React Native, at Xamarin. Ang modelo ng data ay tinutukoy nang isang beses at ginagamit sa lahat ng platform. Binabawasan nito ang pagdoble ng code at ginagarantiyahan ang consistency ng data schema sa pagitan ng iOS at Android application na may shared business logic.

Realm Sync: pag-sync sa pamamagitan ng MongoDB Atlas

Realm Sync ay isang cloud service na naka-embed sa MongoDB Atlas. Awtomatikong sine-sync ng application ang data sa pagitan ng mga device ng user at ng server. Ang mga conflict ay nireso ayon sa “last write wins” na strategy o sa pamamagitan ng custom na Conflict Resolution Functions sa server. Sinusuportahan ng Realm Sync ang partial synchronization (subset of data) para mabawasan ang traffic.

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)
        // Aktibo ang awtomatikong pag-sync
    }
}

SyncConfiguration ay nagko-configure ng koneksyon sa MongoDB Atlas at tinutukoy ang set ng mga model na isi-sync. Pagkatapos ng authentication ng user, awtomatikong naglo-load ang Realm ng data mula sa cloud at pinagsasama ito sa mga lokal na pagbabago. Ang pag-sync ay gumagana sa background thread at hindi nangangailangan ng manu-manong tawag — sapat na ang gumawa ng Realm instance na may SyncConfiguration.

Mga Madalas Itanong

Libre ba ang Realm para sa komersyal na paggamit?

Oo, ang lokal na Realm database ay ganap na libre (lisensyang Apache 2.0). Ang Realm Sync (cloud synchronization) sa pamamagitan ng MongoDB Atlas ay isang bayad na serbisyo na kasama sa subscription ng Atlas Device Sync. Para sa libreng tier ng Atlas, available ang unang 500 MB ng data at 1 milyong operasyon bawat buwan.

Maaari bang mag-migrate mula SQLite patungo sa Realm?

Oo, ang migration ay posible sa pamamagitan ng pag-export ng data mula SQLite patungo sa JSON at pag-import sa Realm sa unang pag-load ng application. Para sa malalaking volume, gumamit ng streaming migration: sumulat ng data nang magkatulad sa parehong database hanggang sa lumipat ang mga user sa bagong bersyon ng application, pagkatapos ay tanggalin ang SQLite file.

Paano hinahawakan ng Realm ang mga conflict sa pag-sync?

Realm Sync ay gumagamit ng default na “last write wins” na strategy — ang huling pagsulat ay nag- overwrite sa nauna. Para sa mga kumplikadong conflict, mag-configure ng custom na Conflict Resolution Functions sa MongoDB Atlas server na pinagsasama ang mga pagbabago mula sa iba't ibang device batay sa business logic ng application (halimbawa, pag-merge ng mga value sa halip na palitan).

Sinusuportahan ba ng Realm ang aggregation queries?

Realm ay hindi sumusuporta sa SQL aggregations (SUM, AVG, GROUP BY) sa antas ng database. Para sa analytical queries, inirerekumenda na i-export ang data mula sa Realm patungo sa MongoDB Atlas sa pamamagitan ng Realm Sync at gawin ang aggregations sa pamamagitan ng MongoDB Aggregation Pipeline. Para sa simpleng pagbibilang, gamitin ang realm.query<T>().count().

Ligtas ba ang data sa Realm?

Realm ay hindi nag-e-encrypt ng data bilang default. Para sa encryption, tukuyin ang 64-byte key sa configuration: Realm.Configuration(encryptionKey: key). Ang encryption ay gumagamit ng AES-256 + SHA-2 HMAC at nagpapataas ng overhead sa mga operasyon ng 10-20%. Kung walang encryption, ang .realm file ay mababasa ng anumang process na may access sa file system.

Buod

  • Realm ay isang NoSQL object-oriented database na may memory-mapped access, live objects, at cross-platform na modelo ng data para sa mga mobile application.
  • Zero-copy architecture ay nagpapahintulot ng direktang pagbasa ng data mula sa memory-mapped file nang walang pagkopya sa mga language object, na ginagawang 10-50% mas mabilis ang Realm kaysa SQLite sa pagbasa.
  • Live Objects at @ObservedResults (SwiftUI) / Flow (Kotlin) ay tinitiyak ang awtomatikong UI update kapag nagbago ang data nang walang manu-manong database query.
  • Realm Sync sa MongoDB Atlas ay nagbibigay ng built-in na cloud synchronization na may conflict resolution sa “last write wins” na strategy.
  • Cross-platform SDKs ay sumusuporta sa Kotlin Multiplatform, Flutter, React Native — ang modelo ng data ay tinutukoy nang isang beses para sa lahat ng platform.
  • Para sa analytical queries ang Realm ay mas mahina kaysa SQLite dahil sa kawalan ng group aggregations — ang mga komplikadong report ay ginagawa sa pamamagitan ng MongoDB Aggregation Pipeline.
  • Rekomendasyon gamitin ang Realm para sa offline na application na may madalas na UI updates at pangangailangan para sa cross-platform synchronization, SQLite/Room para sa mga proyekto may analytics at stable na data sets.

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din