ObjectBox je výkonná NoSQL databáze optimalizovaná pro mobilní a edge zařízení. Na rozdíl od SQLite používá vlastní formát úložiště založený na plochých souborech bez SQL vrstvy. Podle ObjectBox Benchmarks, 2024, ObjectBox provádí operace vkládání a čtení 10–100krát rychleji než SQLite na zařízeních Android, což z něj činí nejlepší volbu pro vysoce zatížené mobilní aplikace.
Hlavní body
ObjectBox je in-memory NoSQL databáze vyvinutá německou společností ObjectBox.io. Na rozdíl od tradičních relačních databází ukládá ObjectBox objekty přímo do plochých souborů pomocí vlastního formátu SLOT (Super Lightweight Object Tree). To eliminuje režii ORM a SQL parseru. Formát SLOT je optimalizován pro práci na zařízeních s omezenou pamětí: data jsou automaticky defragmentována a velikost databáze je v průměru 4–6krát menší než ekvivalentní databáze SQLite se stejným počtem záznamů.
ObjectBox podporuje všechny hlavní mobilní platformy: Android, iOS a Flutter. Pro Android je k dispozici generování kódu prostřednictvím ObjectBox Gradle Plugin, který zpracovává anotované entity a vytváří třídy Box pro práci s daty. Pro Flutter se používá nativní plugin s Dart obalem. Kromě mobilních platforem ObjectBox funguje na Linux, macOS, Windows a WebAssembly, což umožňuje opětovné použití datového modelu mezi mobilní aplikací a synchronizací serveru.
Podle výzkumných dat ObjectBox (2023) se databáze používá ve více než 5000 aplikacích v Google Play, včetně aplikací s publikem přesahujícím 10 milionů uživatelů. Hlavní scénáře: ukládání do mezipaměti, práce v offline režimu a ukládání časových řad (IoT). ObjectBox je obzvláště populární v aplikacích pro sledování zdraví a fitness, kde je vyžadováno rychlé zaznamenávání údajů ze senzorů na zařízení bez stálého internetového připojení a shromažďování analýz z více zařízení.
ObjectBox se objevil jako alternativa k Realm a SQLite pro platformu Android. První stabilní verze byla vydána v roce 2018. Klíčový rozdíl oproti Realm — ObjectBox nemá omezení GPL (používá Apache 2.0) a podporuje více platforem: od mobilních zařízení po Linuxové servery.
ObjectBox poskytuje: automatické generování tříd Box, vestavěné indexy pro rychlé vyhledávání, transakce s podporou vrácení, reaktivní dotazy prostřednictvím RxJava a Kotlin Flow a synchronizaci mezi zařízeními prostřednictvím ObjectBox Sync (vlastní protokol). Na rozdíl od Firebase Realtime Database, ObjectBox Sync funguje v modelu peer-to-peer bez centrálního serveru, což snižuje latenci a náklady na infrastrukturu.
ObjectBox ukládá data ve vlastním binárním formátu .mdb (ObjectBox Data File). Každá entita je mapována na jeden soubor, kde jsou záznamy uloženy sekvenčně s pevným offsetem. To umožňuje číst a zapisovat jednotlivé objekty bez úplného skenování souboru.
Pro práci s ObjectBox není potřeba SQL: dotazy se vytvářejí prostřednictvím fluent-API v kódu. Kompilátor generuje pomocné třídy MyObjectBox a boxy (Box), které zapouzdřují všechny operace CRUD. Datový model je popsán prostřednictvím anotací @Entity, @Id, @Index a @Relation.
// Připojení ObjectBox v Androidu
class App: Application() {
lateinit var boxStore: BoxStore
override fun onCreate() {
super.onCreate()
boxStore = MyObjectBox.builder()
.androidContext(this)
.build()
}
}
Podle oficiálních benchmarků ObjectBox výrazně překonává SQLite v rychlosti operací, zejména při dávkovém vkládání a hromadném čtení. SQLite však zůstává de facto standardem pro mobilní aplikace díky rozšířenosti a vestavěné podpoře SQL.
| Operace | ObjectBox | SQLite | Rozdíl |
|---|---|---|---|
| Vkládání (1000 záznamů) | ~5 ms | ~180 ms | x36 rychlejší |
| Čtení (1000 záznamů) | ~3 ms | ~70 ms | x23 rychlejší |
| Aktualizace (1000 záznamů) | ~6 ms | ~150 ms | x25 rychlejší |
| Vyhledávání podle indexu | ~0.1 ms | ~2 ms | x20 rychlejší |
| Velikost databáze (1000 objektů) | ~28 KB | ~112 KB | 4krát menší |
ObjectBox prohrává s SQLite ve scénářích, kde jsou potřeba složité JOIN dotazy, agregační funkce (SUM, COUNT s grupováním) nebo integrace s existujícím SQL schématem. Pokud projekt již používá SQLite s Room ORM, migrace na ObjectBox bude vyžadovat přepsání celé logiky přístupu k datům. ObjectBox také nepodporuje vlastní SQL dotazy — pouze fluent-API. Pro typické operace CRUD a ukládání do mezipaměti však ObjectBox poskytuje zvýšení výkonu až 100krát, což potvrzují oficiální benchmarky na zařízeních Android s různými verzemi OS.
ObjectBox používá anotace k definování entit. Po kompilaci se vytvoří třídy Box s metodami put, get, remove a query. Níže jsou uvedeny typické operace pro model Task v aplikaci seznamu úkolů.
Každá entita je anotována @Entity. Pole s @Id se stává primárním klíčem, @Index urychluje vyhledávání podle pole. ObjectBox podporuje automatické generování ID při hodnotě 0.
@Entity
data class Task(
@Id var id: Long = 0,
@Index var title: String = "",
var isCompleted: Boolean = false,
var priority: Int = 0
)
Box je hlavní třída pro práci s entitami. Metoda put() ukládá nebo aktualizuje objekt, get() čte podle ID, remove() maže. Všechny základní operace jsou synchronní a provádějí se ve volajícím vlákně.
val taskBox: Box<Task> = boxStore.boxFor(Task::class.java)
// Vytvoření
val task = Task(title = "Nákup produktů", priority = 3)
val newId = taskBox.put(task)
// Čtení
val savedTask = taskBox.get(newId)
// Aktualizace
savedTask.isCompleted = true
taskBox.put(savedTask)
// Smazání
taskBox.remove(newId)
ObjectBox podporuje reaktivní dotazy prostřednictvím .subscribe(). Předplatitel dostává oznámení při každé změně dat odpovídající podmínce dotazu. To je vhodné pro UI, které automaticky aktualizuje seznam při přidávání nebo odebírání prvků.
val query = taskBox.query()
.equal(Task_.isCompleted, false)
.orderDesc(Task_.priority)
.build()
query.subscribe { tasks ->
// tasks — List, aktualizuje se automaticky
updateUi(tasks)
}
ObjectBox podporuje vztahy mezi entitami — To-One, To-Many a Many-to-Many. Vztahy se definují pomocí anotace @Relation. Na rozdíl od SQLite, ObjectBox nepoužívá cizí klíče: vztahy jsou implementovány prostřednictvím seznamů ID v plochých souborech, což urychluje navigaci v grafu objektů.
Vztah @Backlink umožňuje přechod z podřízené entity na nadřazenou bez samostatného referenčního pole. ObjectBox automaticky udržuje zpětný odkaz, čímž eliminuje duplikaci dat a synchronizaci mezi dvěma tabulkami.
ObjectBox Query Builder umožňuje vytvářet řetězce podmínek: equal, notEqual, greater, less, in, contains, startsWith. Všechny podmínky se kombinují pomocí and/or. Výsledek lze třídit, omezit a získat jako List nebo LazyList (pro velké datové sady).
ObjectBox automaticky indexuje pole @Id. Pro vlastní indexy použijte anotaci @Index na polích, podle kterých se často dotazujete. Indexy urychlují dotazy equal a in, ale zpomalují vkládání — neindexujte pole, podle kterých se nevyhledává. ObjectBox podporuje složené indexy pro současné filtrování podle více polí. Složené indexy jsou zvláště užitečné pro filtry v seznamech: například vyhledávání nedokončených úkolů s vysokou prioritou je desítkykrát rychlejší se složeným indexem na polích isCompleted a priority.
ObjectBox Sync — proprietární technologie pro synchronizaci dat mezi zařízeními v reálném čase. Používá protokol založený na WebSocket s řešením konfliktů podle last-writer-wins. Sync je vhodný pro aplikace, které potřebují offline synchronizaci: poznámky, seznamy úkolů, IoT data z více senzorů. Pro produkci je však vyžadován nákup licence.
// Dotaz s více podmínkami
val highPriorityIncomplete = taskBox.query()
.greater(Task_.priority, 5)
.equal(Task_.isCompleted, false)
.build()
.find()
// Vyhledávání podřetězce
val searchResults = taskBox.query()
.contains(Task_.title, "produkt", StringOrder.CASE_INSENSITIVE)
.build()
.find()
Často kladené otázky
ObjectBox je distribuován pod licencí Apache 2.0, která povoluje komerční použití bez omezení. Funkce ObjectBox Sync (multiplatformní synchronizace) je proprietární a vyžaduje nákup licence pro produkci.
BoxStore je thread-safe: více vláken může současně číst data. Zápis je blokován na úrovni Box. Pro složité transakce použijte boxStore.runInTx(), který zaručuje atomicitu skupiny operací.
Ano, ObjectBox podporuje Kotlin Multiplatform (KMP) od verze 3.0. K dispozici jsou cíle Android, iOS, JVM a Native. Pro KMP se používá samostatný Gradle plugin objectbox-kotlin s podporou expect/actual.
ObjectBox ukládá data v souborech .mdb v adresáři aplikace. Pro zálohu zkopírujte celý adresář ObjectBox pomocí BoxStore.copy() nebo ručně po volání boxStore.close(). Živé soubory nelze kopírovat — poškodilo by to data.
Room je ORM nad SQLite, vyžaduje SQL dotazy a má režii na mapování objektů. ObjectBox je NoSQL bez SQL, mnohem rychlejší, ale nepodporuje složité JOINy a není relační databází. Volba závisí na úkolu: pro relační data — Room, pro rychlé ukládání objektů — ObjectBox.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také