Az ObjectBox egy nagy teljesítményű NoSQL adatbázis, amely mobil- és edge-eszközökre van optimalizálva. Az SQLite-tól eltérően saját tárolási formátumot használ, amely lapos fájlokon alapul SQL réteg nélkül. A ObjectBox Benchmarks, 2024 szerint az ObjectBox 10–100-szor gyorsabban hajtja végre a beszúrási és olvasási műveleteket, mint az SQLite Android-eszközökön, ami a legjobb választássá teszi a nagy terhelésű mobilalkalmazások számára.
Főbb pontok
ObjectBox egy in-memory NoSQL adatbázis, amelyet a német ObjectBox.io vállalat fejlesztett ki. A hagyományos relációs adatbázisokkal ellentétben az ObjectBox közvetlenül lapos fájlokban tárolja az objektumokat saját SLOT (Super Lightweight Object Tree) formátumát használva. Ez kiküszöböli az ORM és az SQL elemző többletterhelését. A SLOT formátum korlátozott memóriájú eszközökre van optimalizálva: az adatok automatikusan defragmentálódnak, és az adatbázis mérete átlagosan 4–6-szor kisebb, mint egy egyenértékű SQLite adatbázis azonos számú rekorddal.
Az ObjectBox támogatja az összes főbb mobil platformot: Android, iOS és Flutter. Androidhoz a kódgenerálás az ObjectBox Gradle Plugin segítségével érhető el, amely feldolgozza a kommentált entitásokat és Box osztályokat hoz létre az adatok kezeléséhez. Flutterhez natív bővítményt használnak Dart burkolóval. A mobil platformok mellett az ObjectBox Linux, macOS, Windows és WebAssembly rendszereken is működik, lehetővé téve az adatmodell újrafelhasználását a mobilalkalmazás és a szerver szinkronizációja között.
Az ObjectBox (2023) kutatási adatai szerint az adatbázist több mint 5000 alkalmazásban használják a Google Play-en, köztük olyan alkalmazásokban, amelyek közönsége meghaladja a 10 millió felhasználót. Fő forgatókönyvek: adatok gyorsítótárazása, offline módban történő munkavégzés és idősorok tárolása (IoT). Az ObjectBox különösen népszerű az egészségkövető és fitnesz alkalmazásokban, ahol gyors érzékelőérték-rögzítésre van szükség az eszközön állandó internetkapcsolat nélkül, valamint több eszközről történő analitikai adatgyűjtésre.
ObjectBox a Realm és az SQLite alternatívájaként jelent meg az Android platform számára. Az első stabil verzió 2018-ban jelent meg. A legfontosabb különbség a Realm-től: az ObjectBox-nak nincsenek GPL-korlátozásai (Apache 2.0-t használ), és több platformot támogat: a mobileszközöktől a Linux szerverekig.
ObjectBox a következőket nyújtja: Box osztályok automatikus generálása, beépített indexek a gyors kereséshez, tranzakciók visszaállítási támogatással, reaktív lekérdezések RxJava és Kotlin Flow segítségével, valamint szinkronizáció eszközök között az ObjectBox Sync (saját protokoll) segítségével. A Firebase Realtime Database-től eltérően az ObjectBox Sync peer-to-peer modellben működik központi szerver nélkül, ami csökkenti a késleltetést és az infrastrukturális költségeket.
ObjectBox az adatokat saját bináris .mdb (ObjectBox Data File) formátumában tárolja. Minden entitás egy fájlra van leképezve, ahol a rekordok szekvenciálisan, rögzített eltolással kerülnek tárolásra. Ez lehetővé teszi az egyes objektumok olvasását és írását a teljes fájl beolvasása nélkül.
Az ObjectBox használatához nincs szükség SQL-re: a lekérdezések a kódban található fluent-API segítségével épülnek fel. A fordító létrehozza a MyObjectBox segédosztályokat és a Boxokat, amelyek az összes CRUD műveletet magukba foglalják. Az adatmodellt annotációk (@Entity, @Id, @Index és @Relation) segítségével írjuk le.
// ObjectBox csatlakoztatása Androidban
class App: Application() {
lateinit var boxStore: BoxStore
override fun onCreate() {
super.onCreate()
boxStore = MyObjectBox.builder()
.androidContext(this)
.build()
}
}
A hivatalos tesztek szerint az ObjectBox jelentősen felülmúlja az SQLite-ot a műveletek sebességében, különösen a kötegelt beszúrásnál és a tömeges olvasásnál. Az SQLite azonban továbbra is de facto szabvány marad a mobilalkalmazások számára az elterjedtsége és a beépített SQL-támogatás miatt.
| Művelet | ObjectBox | SQLite | Különbség |
|---|---|---|---|
| Beszúrás (1000 rekord) | ~5 ms | ~180 ms | x36 gyorsabb |
| Olvasás (1000 rekord) | ~3 ms | ~70 ms | x23 gyorsabb |
| Frissítés (1000 rekord) | ~6 ms | ~150 ms | x25 gyorsabb |
| Keresés index alapján | ~0.1 ms | ~2 ms | x20 gyorsabb |
| Adatbázis mérete (1000 objektum) | ~28 KB | ~112 KB | 4-szer kisebb |
ObjectBox alulmarad az SQLite-tal szemben olyan forgatókönyvekben, ahol összetett JOIN lekérdezésekre, aggregált függvényekre (SUM, COUNT csoportosítással) vagy meglévő SQL sémával való integrációra van szükség. Ha a projekt már használja az SQLite-ot Room ORM-mel, az ObjectBox-ra való migráció az adatelérési logika teljes újraírását igényli. Az ObjectBox emellett nem támogatja az egyéni SQL lekérdezéseket, csak a fluent-API-t. A tipikus CRUD műveletek és gyorsítótárazás esetén azonban az ObjectBox akár 100-szoros teljesítménynövekedést is biztosít, amit a hivatalos tesztek is megerősítenek különböző OS-verziójú Android-eszközökön.
ObjectBox annotációkat használ az entitások meghatározásához. A fordítás után Box osztályok jönnek létre put, get, remove és query metódusokkal. Az alábbiakban a tipikus műveletek láthatók a Task modellhez egy teendőlista alkalmazásban.
Minden entitás @Entity annotációval van ellátva. A @Id mező lesz az elsődleges kulcs, a @Index gyorsítja a keresést a mezőben. Az ObjectBox támogatja az automatikus ID generálást 0 érték esetén.
@Entity
data class Task(
@Id var id: Long = 0,
@Index var title: String = "",
var isCompleted: Boolean = false,
var priority: Int = 0
)
Box a fő osztály az entitásokkal való munkához. A put() metódus elmenti vagy frissíti az objektumot, a get() ID alapján olvas, a remove() töröl. Az összes alapművelet szinkron, és a hívó szálon hajtódik végre.
val taskBox: Box<Task> = boxStore.boxFor(Task::class.java)
// Létrehozás
val task = Task(title = "Termékek vásárlása", priority = 3)
val newId = taskBox.put(task)
// Olvasás
val savedTask = taskBox.get(newId)
// Frissítés
savedTask.isCompleted = true
taskBox.put(savedTask)
// Törlés
taskBox.remove(newId)
ObjectBox támogatja a reaktív lekérdezéseket a .subscribe() segítségével. Az előfizető értesítést kap minden olyan adatváltozásról, amely megfelel a lekérdezés feltételének. Ez kényelmes az UI számára, amely automatikusan frissíti a listát elemek hozzáadásakor vagy eltávolításakor.
val query = taskBox.query()
.equal(Task_.isCompleted, false)
.orderDesc(Task_.priority)
.build()
query.subscribe { tasks ->
// tasks — List, automatikusan frissül
updateUi(tasks)
}
ObjectBox támogatja az entitások közötti kapcsolatokat — To-One, To-Many és Many-to-Many. A kapcsolatokat a @Relation annotáció segítségével határozzuk meg. Az SQLite-tól eltérően az ObjectBox nem használ külső kulcsokat: a kapcsolatok ID-listák segítségével valósulnak meg lapos fájlokban, ami gyorsítja az objektumgráfban való navigálást.
A @Backlink kapcsolat lehetővé teszi a gyermek entitástól a szülőhöz való navigálást külön referenciamező nélkül. Az ObjectBox automatikusan fenntartja a visszafelé mutató hivatkozást, ami kiküszöböli az adatok duplikálását és a két tábla közötti szinkronizációt.
ObjectBox Query Builder lehetővé teszi feltételláncok építését: equal, notEqual, greater, less, in, contains, startsWith. Minden feltétel and/or segítségével kombinálható. Az eredmény rendezhető, korlátozható, és List vagy LazyList formájában kérhető le (nagy adathalmazok esetén).
ObjectBox automatikusan indexeli a @Id mezőt. Egyéni indexekhez használja a @Index annotációt azokon a mezőkön, amelyekre gyakran keres. Az indexek gyorsítják az equal és a in lekérdezéseket, de lassítják a beszúrást — ne indexeljen olyan mezőket, amelyekre nem keres. Az ObjectBox támogatja az összetett indexeket a több mezőre történő egyidejű szűréshez. Az összetett indexek különösen hasznosak a listák szűrőihez: például a befejezetlen, magas prioritású feladatok keresése tízszer gyorsabban történik meg összetett indexszel az isCompleted és priority mezőkön.
ObjectBox Sync egy saját technológia az eszközök közötti valós idejű adatszinkronizációhoz. WebSocket-alapú protokollt használ utolsó-írás-nyer konfliktusmegoldással. A Sync olyan alkalmazásokhoz alkalmas, amelyek offline szinkronizációt igényelnek: jegyzetek, teendőlisták, IoT-adatok több érzékelőtől. A termelési használathoz azonban licenc vásárlása szükséges.
// Több feltételes lekérdezés
val highPriorityIncomplete = taskBox.query()
.greater(Task_.priority, 5)
.equal(Task_.isCompleted, false)
.build()
.find()
// Keresés részstring alapján
val searchResults = taskBox.query()
.contains(Task_.title, "termék", StringOrder.CASE_INSENSITIVE)
.build()
.find()
Gyakran Ismételt Kérdések
ObjectBox Apache 2.0 licenc alatt kerül terjesztésre, amely korlátozás nélküli kereskedelmi használatot tesz lehetővé. Az ObjectBox Sync (platformok közötti szinkronizáció) funkció saját tulajdonú, és termelési használathoz licenc vásárlása szükséges.
BoxStore szálbiztos: több szál is olvashatja egyszerre az adatokat. Az írás Box szinten blokkolva van. Összetett tranzakciókhoz használja a boxStore.runInTx()-t, amely garantálja a műveletcsoport atomi végrehajtását.
Igen, az ObjectBox támogatja a Kotlin Multiplatform (KMP)-ot a 3.0 verziótól kezdve. Android, iOS, JVM és Native célok érhetők el. A KMP-hez külön Gradle bővítményt használnak objectbox-kotlin néven expect/actual támogatással.
ObjectBox .mdb fájlokban tárolja az adatokat az alkalmazás könyvtárában. A biztonsági mentéshez másolja a teljes ObjectBox könyvtárat a BoxStore.copy() segítségével, vagy a fájlokat manuálisan a boxStore.close() meghívása után. Élő fájlokat nem szabad másolni — ez károsítja az adatokat.
Room egy ORM az SQLite felett, SQL lekérdezéseket igényel, és többletterheléssel jár az objektumok leképezése miatt. Az ObjectBox NoSQL SQL nélkül, sokkal gyorsabb, de nem támogatja az összetett JOIN-okat, és nem relációs adatbázis. A választás a feladattól függ: relációs adatokhoz — Room, gyors objektumtároláshoz — ObjectBox.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is