ObjectBox: mi ez, NoSQL adatbázis és adatkezelés

Szerző: IT Sectr Megjelenés: 2026-03-13 Olvasási idő: 9 perc

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 — NoSQL adatbázis lapos fájlokkal, SQL és ORM réteg nélkül
  • Teljesítmény — 10–100-szor gyorsabb, mint az SQLite írási és olvasási műveleteknél
  • Platformfüggetlenség — Android, iOS, Linux, macOS, Windows és WebAssembly
  • Reaktivitás — beépített Observable és Flow a változások követésére
  • Könnyű integráció — kódgenerálás annotációkon keresztül, SQL lekérdezések nélkül

Mi az ObjectBox?

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.

Történet és pozicionálás

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.

Fő képességek

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.

Hogyan működik az ObjectBox?

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.

kotlin
// ObjectBox csatlakoztatása Androidban
class App: Application() {
    lateinit var boxStore: BoxStore

    override fun onCreate() {
        super.onCreate()
        boxStore = MyObjectBox.builder()
            .androidContext(this)
            .build()
    }
}

ObjectBox vs SQLite: teljesítmény összehasonlítás

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űveletObjectBoxSQLiteKülönbség
Beszúrás (1000 rekord)~5 ms~180 msx36 gyorsabb
Olvasás (1000 rekord)~3 ms~70 msx23 gyorsabb
Frissítés (1000 rekord)~6 ms~150 msx25 gyorsabb
Keresés index alapján~0.1 ms~2 msx20 gyorsabb
Adatbázis mérete (1000 objektum)~28 KB~112 KB4-szer kisebb

Mikor nem optimális az ObjectBox

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.

Kódpéldák ObjectBox-szal

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.

Entitás meghatározása

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.

kotlin
@Entity
data class Task(
    @Id var id: Long = 0,
    @Index var title: String = "",
    var isCompleted: Boolean = false,
    var priority: Int = 0
)

CRUD műveletek

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.

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

Reaktív lekérdezések

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.

kotlin
val query = taskBox.query()
    .equal(Task_.isCompleted, false)
    .orderDesc(Task_.priority)
    .build()

query.subscribe { tasks ->
    // tasks — List, automatikusan frissül
    updateUi(tasks)
}

Kapcsolatok és lekérdezések az ObjectBox-ban

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.

One-to-Many a @Backlink segítségével

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.

Fluent lekérdezések

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

Indexek konfigurálása a keresés gyorsításához

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 — szinkronizáció eszközök között

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.

kotlin
// 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

Ingyenes az ObjectBox kereskedelmi használatra?

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.

Támogatja az ObjectBox a többszálúságot?

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.

Használható az ObjectBox Kotlin Multiplatform-mal?

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.

Hogyan készíthetek biztonsági mentést az ObjectBox adatbázisról?

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.

Miben különbözik az ObjectBox a Room-tól?

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ó

  • ObjectBox — NoSQL adatbázis 10–100-szor nagyobb teljesítménnyel, mint az SQLite mobileszközökön
  • Lapos fájlok — saját SLOT formátum SQL réteg és ORM költségek nélkül
  • Annotációk — @Entity, @Id, @Index, @Relation az adatmodell leírásához
  • Reaktivitás — beépített Observable és Flow az automatikus UI frissítéshez
  • Platformfüggetlenség — Android, iOS, Linux, macOS, Windows, WebAssembly
  • Gyorsítótárazás és offline — az ObjectBox fő forgatókönyve mobilalkalmazásokban
  • Javaslat — válassza az ObjectBox-ot olyan feladatokhoz, ahol az adatfeldolgozás sebessége fontosabb, mint a relációs integritás

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.

Projekt megbeszélése

Olvassa el is