ObjectBox је високоперформансна NoSQL база података оптимизована за мобилне и edge уређаје. За разлику од SQLite, користи сопствени формат складиштења заснован на равним датотекама без SQL слоја. Према ObjectBox Benchmarks, 2024, ObjectBox обавља операције уметања и читања 10–100 пута брже од SQLite на Android уређајима, што га чини најбољим избором за високооптерећене мобилне апликације.
Главне тачке
ObjectBox је in-memory NoSQL база података развијена од стране немачке компаније ObjectBox.io. За разлику од традиционалних релационих база, ObjectBox чува објекте директно у равним датотекама, користећи сопствени SLOT (Super Lightweight Object Tree) формат. Ово елиминише додатни напор ORM-а и SQL парсера. SLOT формат је оптимизован за рад на уређајима са ограниченом меморијом: подаци се аутоматски дефрагментирају, а величина базе је у просеку 4–6 пута мања од еквивалентне SQLite базе са истим бројем записа.
ObjectBox подржава све главне мобилне платформе: Android, iOS и Flutter. За Android је доступна генерација кода кроз ObjectBox Gradle Plugin, који обрађује анотиране ентитете и креира Box класе за рад са подацима. За Flutter се користи native прикључак са Dart омотом. Поред мобилних платформи, ObjectBox ради на Linux, macOS, Windows и WebAssembly, омогућавајући поновну употребу модела података између мобилне апликације и серверске синхронизације.
Према подацима истраживања ObjectBox (2023), база података се користи у преко 5000 апликација у Google Play-у, укључујући апликације са публиком већом од 10 милиона корисника. Главни сценарији: кеширање података, рад у офлајн режиму и чување временских серија (IoT). ObjectBox је посебно популаран у апликацијама за праћење здравља и фитнеса, где је потребно брзо записивање очитавања сензора на уређају без сталне интернет везе и прикупљање аналитике са више уређаја.
ObjectBox се појавио као алтернатива Realm-у и SQLite-у за Android платформу. Прва стабилна верзија објављена је 2018. године. Кључна разлика од Realm-а — ObjectBox нема GPL ограничења (користи Apache 2.0) и подржава више платформи: од мобилних уређаја до Linux сервера.
ObjectBox пружа: аутоматско генерисање Box класа, уграђене индексе за брзу претрагу, трансакције са подршком за повлачење, реактивне упите кроз RxJava и Kotlin Flow, као и синхронизацију између уређаја кроз ObjectBox Sync (власнички протокол). За разлику од Firebase Realtime Database, ObjectBox Sync ради по peer-to-peer моделу без централног сервера, што смањује кашњење и трошкове инфраструктуре.
ObjectBox чува податке у свом бинарном формату .mdb (ObjectBox Data File). Сваки ентитет (Entity) се мапира на једну датотеку, где се записи чувају секвенцијално са фиксним помаком. Ово омогућава читање и записивање појединачних објеката без потпуног скенирања датотеке.
За рад са ObjectBox није потребан SQL: упити се граде кроз fluent-API у коду. Компајлер генерише помоћне класе MyObjectBox и кутије (Box) које инкапсулирају све CRUD операције. Модел података се описује кроз анотације @Entity, @Id, @Index и @Relation.
// Повезивање ObjectBox у Android
class App: Application() {
lateinit var boxStore: BoxStore
override fun onCreate() {
super.onCreate()
boxStore = MyObjectBox.builder()
.androidContext(this)
.build()
}
}
Према званичним бенчмарковима, ObjectBox значајно надмашује SQLite по брзини операција, посебно при серијском уметању и масовном читању. Међутим, SQLite остаје де факто стандард за мобилне апликације захваљујући распрострањености и уграђеној SQL подршци.
| Операција | ObjectBox | SQLite | Разлика |
|---|---|---|---|
| Уметање (1000 записа) | ~5 мс | ~180 мс | x36 брже |
| Читање (1000 записа) | ~3 мс | ~70 мс | x23 брже |
| Ажурирање (1000 записа) | ~6 мс | ~150 мс | x25 брже |
| Претрага по индексу | ~0.1 мс | ~2 мс | x20 брже |
| Величина базе (1000 објеката) | ~28 KB | ~112 KB | 4 пута мања |
ObjectBox губи од SQLite у сценаријима где су потребни сложени JOIN упити, агрегатне функције (SUM, COUNT са груписањем) или интеграција са постојећом SQL шемом. Ако пројекат већ користи SQLite са Room ORM-ом — миграција на ObjectBox ће захтевати преписивање целокупне логике приступа подацима. ObjectBox такође не подржава прилагођене SQL упите — само fluent-API. Међутим, за типичне CRUD операције и кеширање, ObjectBox даје повећање перформанси до 100 пута, што потврђују званични бенчмаркови на Android уређајима са различитим верзијама ОС-а.
ObjectBox користи анотације за дефинисање ентитета. Након компилације креирају се Box класе са методама put, get, remove и query. Испод су приказане типичне операције за модел Task у апликацији листе задатака.
Сваки ентитет се анотира са @Entity. Поље са @Id постаје примарни кључ, @Index убрзава претрагу по пољу. ObjectBox подржава аутоматско генерисање ID-а при вредности 0.
@Entity
data class Task(
@Id var id: Long = 0,
@Index var title: String = "",
var isCompleted: Boolean = false,
var priority: Int = 0
)
Box — главна класа за рад са ентитетима. Метод put() чува или ажурира објекат, get() чита по ID-у, remove() брише. Све основне операције су синхроне и извршавају се на позивајућој нити.
val taskBox: Box<Task> = boxStore.boxFor(Task::class.java)
// Креирање
val task = Task(title = "Купи производе", priority = 3)
val newId = taskBox.put(task)
// Читање
val savedTask = taskBox.get(newId)
// Ажурирање
savedTask.isCompleted = true
taskBox.put(savedTask)
// Брисање
taskBox.remove(newId)
ObjectBox подржава реактивне упите кроз .subscribe(). Претплатник добија обавештења при свакој промени података која одговарају услову упита. Ово је згодно за UI који аутоматски ажурира листу при додавању или брисању елемената.
val query = taskBox.query()
.equal(Task_.isCompleted, false)
.orderDesc(Task_.priority)
.build()
query.subscribe { tasks ->
// tasks — List, обновляется автоматически
updateUi(tasks)
}
ObjectBox подржава везе између ентитета — To-One, To-Many и Many-to-Many. Везе се задају кроз анотацију @Relation. За разлику од SQLite, ObjectBox не користи спољне кључеве: везе су реализоване кроз листе ID-јева у равним датотекама, што убрзава навигацију по графу објеката.
Веза @Backlink омогућава прелазак од подређеног ентитета ка надређеном без засебног поља референце. ObjectBox аутоматски одржава повратну референцу, чиме се елиминише дуплирање података и синхронизација између две табеле.
ObjectBox Query Builder омогућава градњу ланаца услова: equal, notEqual, greater, less, in, contains, startsWith. Сви услови се комбинују кроз and/or. Резултат се може сортирати, ограничити и добити као List или LazyList (за велике скупове података).
ObjectBox аутоматски индексира поље @Id. За прилагођене индексе користите анотацију @Index на пољима по којима се често извршавају упити. Индекси убрзавају equal и in упите, али успоравају уметање — не индексирајте поља по којима се не врши претрага. ObjectBox подржава сложене индексе за филтрирање по више поља истовремено. Комбиновани индекси су посебно корисни за филтере на листама: на пример, претрага незавршених задатака са високим приоритетом изводи се десетинама пута брже са сложеним индексом на пољима isCompleted и priority.
ObjectBox Sync — власничка технологија за синхронизацију података између уређаја у реалном времену. Користи протокол заснован на WebSocket-у са решавањем конфликта по принципу last-writer-wins. Sync је погодан за апликације којима је потребна офлајн синхронизација: белешке, листе задатака, IoT подаци са више сензора. Међутим, за продукцију је потребна куповина лиценце.
// Упит са више услова
val highPriorityIncomplete = taskBox.query()
.greater(Task_.priority, 5)
.equal(Task_.isCompleted, false)
.build()
.find()
// Претрага по подстрингу
val searchResults = taskBox.query()
.contains(Task_.title, "производ", StringOrder.CASE_INSENSITIVE)
.build()
.find()
Често постављана питања
ObjectBox се дистрибуира под Apache 2.0 лиценцом, која дозвољава комерцијалну употребу без ограничења. Функција ObjectBox Sync (вишеплатформна синхронизација) је власничка и захтева куповину лиценце за продукцију.
BoxStore је нитно безбедан: више нити може истовремено читати податке. Писање се блокира на нивоу Box-а. За сложене трансакције користите boxStore.runInTx(), који гарантује атомарност групе операција.
Да, ObjectBox подржава Kotlin Multiplatform (KMP) од верзије 3.0. Доступни су target-и Android, iOS, JVM и Native. За KMP се користи засебан Gradle plugin objectbox-kotlin са подршком за expect/actual.
ObjectBox чува податке у .mdb датотекама у директоријуму апликације. За резервну копију копирајте цео ObjectBox директоријум кроз BoxStore.copy() или ручно копирајте датотеке након позива boxStore.close(). Живе датотеке се не могу копирати — то ће оштетити податке.
Room — ORM изнад SQLite, захтева SQL упите и има додатни напор за мапирање објеката. ObjectBox је NoSQL без SQL-а, знатно бржи, али не подржава сложене JOIN-ове и није релациона база података. Избор зависи од задатка: за релационе податке — Room, за брзо објектно складиштење — ObjectBox.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође