Ang ObjectBox ay isang mataas na pagganap na NoSQL database na na-optimize para sa mga mobile at edge device. Hindi tulad ng SQLite, gumagamit ito ng sariling format ng imbakan batay sa mga flat file na walang SQL layer. Ayon sa ObjectBox Benchmarks, 2024, ang ObjectBox ay nagsasagawa ng mga operasyon ng pagpasok at pagbasa ng 10–100 beses na mas mabilis kaysa sa SQLite sa mga Android device, na ginagawa itong pinakamahusay na pagpipilian para sa mga high-load na mobile application.
Mga Pangunahing Punto
ObjectBox ay isang in-memory NoSQL database na binuo ng German company na ObjectBox.io. Hindi tulad ng tradisyonal na relational database, direktang nag-iimbak ang ObjectBox ng mga bagay sa flat file gamit ang sarili nitong SLOT (Super Lightweight Object Tree) na format. Inaalis nito ang overhead ng ORM at SQL parser. Ang SLOT format ay na-optimize para sa pagtatrabaho sa mga device na may limitadong memorya: ang data ay awtomatikong dinedefragment, at ang laki ng database ay nasa average na 4–6 na beses na mas maliit kaysa sa katumbas na SQLite database na may parehong bilang ng mga tala.
Sinusuportahan ng ObjectBox ang lahat ng pangunahing mobile platform: Android, iOS at Flutter. Para sa Android, available ang code generation sa pamamagitan ng ObjectBox Gradle Plugin na nagpoproseso ng mga naka-annotate na entity at lumilikha ng Box classes para sa pagtatrabaho sa data. Para sa Flutter, ginagamit ang native plugin na may Dart wrapper. Bukod sa mga mobile platform, gumagana ang ObjectBox sa Linux, macOS, Windows at WebAssembly, na nagpapahintulot sa muling paggamit ng modelo ng data sa pagitan ng mobile app at server synchronization.
Ayon sa data ng pananaliksik ng ObjectBox (2023), ang database ay ginagamit sa mahigit 5000 app sa Google Play, kabilang ang mga app na may audience na mahigit 10 milyong user. Mga pangunahing sitwasyon: pag-cache ng data, pagtatrabaho sa offline mode at pag-iimbak ng time series (IoT). Ang ObjectBox ay lalong popular sa mga health tracking at fitness app, kung saan kinakailangan ang mabilis na pag-record ng sensor readings sa device nang walang permanenteng koneksyon sa internet at pagkolekta ng analytics mula sa maraming device.
ObjectBox ay lumitaw bilang alternatibo sa Realm at SQLite para sa Android platform. Ang unang stable na bersyon ay inilabas noong 2018. Pangunahing pagkakaiba sa Realm: ang ObjectBox ay walang mga limitasyon sa GPL (gumagamit ng Apache 2.0) at sumusuporta sa mas maraming platform: mula sa mobile device hanggang sa Linux server.
ObjectBox ay nagbibigay ng: awtomatikong pagbuo ng Box classes, built-in na index para sa mabilis na paghahanap, mga transaksyon na may suporta sa pag-urong, mga reaktibong query sa pamamagitan ng RxJava at Kotlin Flow, pati na rin ang synchronization sa pagitan ng mga device sa pamamagitan ng ObjectBox Sync (proprietary protocol). Hindi tulad ng Firebase Realtime Database, ang ObjectBox Sync ay gumagana sa peer-to-peer na modelo nang walang central server, na nagbabawas ng latency at mga gastos sa imprastraktura.
ObjectBox ay nag-iimbak ng data sa sarili nitong binary .mdb (ObjectBox Data File) na format. Ang bawat entity ay naka-map sa isang file, kung saan ang mga tala ay iniimbak nang sunud-sunod na may fixed offset. Pinapayagan nito ang pagbasa at pagsulat ng mga indibidwal na bagay nang hindi kailangang i-scan ang buong file.
Para sa pagtatrabaho sa ObjectBox, hindi kailangan ang SQL: ang mga query ay binuo sa pamamagitan ng fluent-API sa code. Ang compiler ay bumubuo ng mga helper class na MyObjectBox at mga kahon (Box) na nag-e-encapsulate ng lahat ng CRUD operations. Ang modelo ng data ay inilalarawan sa pamamagitan ng mga anotasyon @Entity, @Id, @Index at @Relation.
// Pagkonekta ng ObjectBox sa Android
class App: Application() {
lateinit var boxStore: BoxStore
override fun onCreate() {
super.onCreate()
boxStore = MyObjectBox.builder()
.androidContext(this)
.build()
}
}
Ayon sa opisyal na mga benchmark, ang ObjectBox ay makabuluhang nahihigitan ang SQLite sa bilis ng operasyon, lalo na sa batch insertion at mass reading. Gayunpaman, ang SQLite ay nananatiling de facto standard para sa mga mobile application dahil sa pagkalat at built-in na SQL support.
| Operasyon | ObjectBox | SQLite | Pagkakaiba |
|---|---|---|---|
| Pagpasok (1000 tala) | ~5 ms | ~180 ms | x36 mas mabilis |
| Pagbasa (1000 tala) | ~3 ms | ~70 ms | x23 mas mabilis |
| Pag-update (1000 tala) | ~6 ms | ~150 ms | x25 mas mabilis |
| Paghahanap ayon sa index | ~0.1 ms | ~2 ms | x20 mas mabilis |
| Laki ng database (1000 bagay) | ~28 KB | ~112 KB | 4 na beses mas maliit |
ObjectBox ay natatalo sa SQLite sa mga sitwasyon kung saan kailangan ang mga kumplikadong JOIN query, aggregate functions (SUM, COUNT na may pagpapangkat) o integrasyon sa umiiral na SQL schema. Kung ang proyekto ay gumagamit na ng SQLite na may Room ORM, ang paglipat sa ObjectBox ay mangangailangan ng muling pagsulat ng buong lohika ng pag-access sa data. Hindi rin sinusuportahan ng ObjectBox ang custom na SQL query, tanging fluent-API. Gayunpaman, para sa tipikal na CRUD operations at caching, ang ObjectBox ay nagbibigay ng pagtaas ng pagganap hanggang 100 beses, na kinumpirma ng opisyal na mga benchmark sa Android device na may iba't ibang bersyon ng OS.
ObjectBox ay gumagamit ng mga anotasyon para sa pagtukoy ng mga entity. Pagkatapos ng compilation, nilikha ang Box classes na may mga pamamaraang put, get, remove at query. Sa ibaba ay ipinapakita ang mga tipikal na operasyon para sa modelong Task sa isang to-do list app.
Ang bawat entity ay naka-annotate ng @Entity. Ang field na may @Id ay nagiging pangunahing susi, ang @Index ay nagpapabilis ng paghahanap ayon sa field. Sinusuportahan ng ObjectBox ang awtomatikong pagbuo ng ID sa halagang 0.
@Entity
data class Task(
@Id var id: Long = 0,
@Index var title: String = "",
var isCompleted: Boolean = false,
var priority: Int = 0
)
Box ay ang pangunahing klase para sa pagtatrabaho sa mga entity. Ang pamamaraang put() ay nag-iimbak o nag-a-update ng bagay, ang get() ay nagbabasa ayon sa ID, ang remove() ay nagtatanggal. Lahat ng pangunahing operasyon ay synchronous at isinasagawa sa tumatawag na thread.
val taskBox: Box<Task> = boxStore.boxFor(Task::class.java)
// Paglikha
val task = Task(title = "Bumili ng mga produkto", priority = 3)
val newId = taskBox.put(task)
// Pagbasa
val savedTask = taskBox.get(newId)
// Pag-update
savedTask.isCompleted = true
taskBox.put(savedTask)
// Pag-alis
taskBox.remove(newId)
ObjectBox ay sumusuporta sa mga reaktibong query sa pamamagitan ng .subscribe(). Ang subscriber ay tumatanggap ng mga abiso sa bawat pagbabago ng data na tumutugma sa kondisyon ng query. Ito ay maginhawa para sa UI na awtomatikong nag-a-update ng listahan kapag nagdadagdag o nagtatanggal ng mga elemento.
val query = taskBox.query()
.equal(Task_.isCompleted, false)
.orderDesc(Task_.priority)
.build()
query.subscribe { tasks ->
// tasks — List, awtomatikong ina-update
updateUi(tasks)
}
ObjectBox ay sumusuporta sa mga relasyon sa pagitan ng mga entity — To-One, To-Many at Many-to-Many. Ang mga relasyon ay tinutukoy sa pamamagitan ng anotasyong @Relation. Hindi tulad ng SQLite, ang ObjectBox ay hindi gumagamit ng foreign key: ang mga relasyon ay ipinapatupad sa pamamagitan ng mga listahan ng ID sa flat file, na nagpapabilis sa pag-navigate sa graph ng bagay.
Ang relasyong @Backlink ay nagpapahintulot sa pag-navigate mula sa child entity patungo sa parent nang walang hiwalay na reference field. Awtomatikong pinapanatili ng ObjectBox ang back reference, na inaalis ang pagdoble ng data at synchronization sa pagitan ng dalawang table.
ObjectBox Query Builder ay nagpapahintulot sa pagbuo ng mga chain ng condition: equal, notEqual, greater, less, in, contains, startsWith. Lahat ng condition ay pinagsama sa pamamagitan ng and/or. Ang resulta ay maaaring i-sort, limitahan at makuha bilang List o LazyList (para sa malalaking set ng data).
ObjectBox ay awtomatikong nag-i-index ng @Id field. Para sa custom na index, gamitin ang anotasyong @Index sa mga field na madalas na query. Pinapabilis ng mga index ang equal at in query, ngunit pinapabagal ang pagpasok — huwag i-index ang mga field na hindi pinaghahanap. Sinusuportahan ng ObjectBox ang mga composite index para sa sabay-sabay na pag-filter sa maraming field. Ang mga composite index ay lalong kapaki-pakinabang para sa mga filter sa listahan: halimbawa, ang paghahanap ng mga hindi natapos na gawain na may mataas na priyoridad ay ginagawa nang sampu-sampung beses na mas mabilis gamit ang composite index sa mga field na isCompleted at priority.
ObjectBox Sync ay isang proprietary na teknolohiya para sa real-time na synchronization ng data sa pagitan ng mga device. Gumagamit ito ng protocol na batay sa WebSocket na may conflict resolution ayon sa last-writer-wins. Ang Sync ay angkop para sa mga app na nangangailangan ng offline synchronization: mga tala, listahan ng gawain, data ng IoT mula sa maraming sensor. Gayunpaman, para sa produksyon kinakailangan ang pagbili ng lisensya.
// Query na may maraming kondisyon
val highPriorityIncomplete = taskBox.query()
.greater(Task_.priority, 5)
.equal(Task_.isCompleted, false)
.build()
.find()
// Paghahanap ng substring
val searchResults = taskBox.query()
.contains(Task_.title, "produkto", StringOrder.CASE_INSENSITIVE)
.build()
.find()
Mga Madalas Itanong
ObjectBox ay ipinamamahagi sa ilalim ng lisensyang Apache 2.0 na nagpapahintulot sa komersyal na paggamit nang walang limitasyon. Ang tampok na ObjectBox Sync (cross-platform synchronization) ay proprietary at nangangailangan ng pagbili ng lisensya para sa produksyon.
BoxStore ay thread-safe: maraming thread ang maaaring magbasa ng data nang sabay-sabay. Ang pagsulat ay naka-block sa antas ng Box. Para sa mga kumplikadong transaksyon gamitin ang boxStore.runInTx() na ginagarantiyahan ang atomicity ng grupo ng mga operasyon.
Oo, ObjectBox ay sumusuporta sa Kotlin Multiplatform (KMP) mula sa bersyon 3.0. Available ang mga target na Android, iOS, JVM at Native. Para sa KMP ginagamit ang hiwalay na Gradle plugin na objectbox-kotlin na may suporta sa expect/actual.
ObjectBox ay nag-iimbak ng data sa .mdb file sa direktoryo ng app. Para sa backup, kopyahin ang buong direktoryo ng ObjectBox sa pamamagitan ng BoxStore.copy() o manu-manong kopyahin ang mga file pagkatapos tawagan ang boxStore.close(). Ang mga live na file ay hindi maaaring kopyahin — masisira nito ang data.
Room ay ORM sa ibabaw ng SQLite, nangangailangan ng SQL query at may overhead sa pagmamapa ng bagay. Ang ObjectBox ay NoSQL na walang SQL, mas mabilis, ngunit hindi sumusuporta sa kumplikadong JOIN at hindi relational database. Ang pagpili ay depende sa gawain: para sa relational data — Room, para sa mabilis na pag-iimbak ng bagay — ObjectBox.
Buod
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.
Basahin din