ObjectBox: шта је то, NoSQL база података и рад са подацима

Аутор: IT Sectr Објављено: 2026-03-13 Време читања: 9 мин

ObjectBox је високоперформансна NoSQL база података оптимизована за мобилне и edge уређаје. За разлику од SQLite, користи сопствени формат складиштења заснован на равним датотекама без SQL слоја. Према ObjectBox Benchmarks, 2024, ObjectBox обавља операције уметања и читања 10–100 пута брже од SQLite на Android уређајима, што га чини најбољим избором за високооптерећене мобилне апликације.

Главне тачке

  • ObjectBox — NoSQL база са равним датотекама, без SQL и ORM слоја
  • Перформансе — 10–100 пута бржи од SQLite на операцијама писања и читања
  • Вишеплатформност — Android, iOS, Linux, macOS, Windows и WebAssembly
  • Реактивност — уграђени Observable и Flow за праћење промена
  • Лака интеграција — генерисање кода кроз анотације, без SQL упита

Шта је ObjectBox?

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?

ObjectBox чува податке у свом бинарном формату .mdb (ObjectBox Data File). Сваки ентитет (Entity) се мапира на једну датотеку, где се записи чувају секвенцијално са фиксним помаком. Ово омогућава читање и записивање појединачних објеката без потпуног скенирања датотеке.

За рад са ObjectBox није потребан SQL: упити се граде кроз fluent-API у коду. Компајлер генерише помоћне класе MyObjectBox и кутије (Box) које инкапсулирају све CRUD операције. Модел података се описује кроз анотације @Entity, @Id, @Index и @Relation.

kotlin
// Повезивање ObjectBox у Android
class App: Application() {
    lateinit var boxStore: BoxStore

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

ObjectBox vs SQLite: поређење перформанси

Према званичним бенчмарковима, ObjectBox значајно надмашује SQLite по брзини операција, посебно при серијском уметању и масовном читању. Међутим, SQLite остаје де факто стандард за мобилне апликације захваљујући распрострањености и уграђеној SQL подршци.

ОперацијаObjectBoxSQLiteРазлика
Уметање (1000 записа)~5 мс~180 мсx36 брже
Читање (1000 записа)~3 мс~70 мсx23 брже
Ажурирање (1000 записа)~6 мс~150 мсx25 брже
Претрага по индексу~0.1 мс~2 мсx20 брже
Величина базе (1000 објеката)~28 KB~112 KB4 пута мања

Када ObjectBox није оптималан

ObjectBox губи од SQLite у сценаријима где су потребни сложени JOIN упити, агрегатне функције (SUM, COUNT са груписањем) или интеграција са постојећом SQL шемом. Ако пројекат већ користи SQLite са Room ORM-ом — миграција на ObjectBox ће захтевати преписивање целокупне логике приступа подацима. ObjectBox такође не подржава прилагођене SQL упите — само fluent-API. Међутим, за типичне CRUD операције и кеширање, ObjectBox даје повећање перформанси до 100 пута, што потврђују званични бенчмаркови на Android уређајима са различитим верзијама ОС-а.

Примери кода са ObjectBox

ObjectBox користи анотације за дефинисање ентитета. Након компилације креирају се Box класе са методама put, get, remove и query. Испод су приказане типичне операције за модел Task у апликацији листе задатака.

Дефинисање ентитета

Сваки ентитет се анотира са @Entity. Поље са @Id постаје примарни кључ, @Index убрзава претрагу по пољу. ObjectBox подржава аутоматско генерисање ID-а при вредности 0.

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

CRUD операције

Box — главна класа за рад са ентитетима. Метод put() чува или ажурира објекат, get() чита по ID-у, remove() брише. Све основне операције су синхроне и извршавају се на позивајућој нити.

kotlin
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 који аутоматски ажурира листу при додавању или брисању елемената.

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

query.subscribe { tasks ->
    // tasks — List, обновляется автоматически
    updateUi(tasks)
}

Везе и упити у ObjectBox

ObjectBox подржава везе између ентитета — To-One, To-Many и Many-to-Many. Везе се задају кроз анотацију @Relation. За разлику од SQLite, ObjectBox не користи спољне кључеве: везе су реализоване кроз листе ID-јева у равним датотекама, што убрзава навигацију по графу објеката.

One-to-Many кроз @Backlink

Веза @Backlink омогућава прелазак од подређеног ентитета ка надређеном без засебног поља референце. ObjectBox аутоматски одржава повратну референцу, чиме се елиминише дуплирање података и синхронизација између две табеле.

Fluent упити

ObjectBox Query Builder омогућава градњу ланаца услова: equal, notEqual, greater, less, in, contains, startsWith. Сви услови се комбинују кроз and/or. Резултат се може сортирати, ограничити и добити као List или LazyList (за велике скупове података).

Подешавање индекса за убрзање претраге

ObjectBox аутоматски индексира поље @Id. За прилагођене индексе користите анотацију @Index на пољима по којима се често извршавају упити. Индекси убрзавају equal и in упите, али успоравају уметање — не индексирајте поља по којима се не врши претрага. ObjectBox подржава сложене индексе за филтрирање по више поља истовремено. Комбиновани индекси су посебно корисни за филтере на листама: на пример, претрага незавршених задатака са високим приоритетом изводи се десетинама пута брже са сложеним индексом на пољима isCompleted и priority.

ObjectBox Sync — синхронизација између уређаја

ObjectBox Sync — власничка технологија за синхронизацију података између уређаја у реалном времену. Користи протокол заснован на WebSocket-у са решавањем конфликта по принципу last-writer-wins. Sync је погодан за апликације којима је потребна офлајн синхронизација: белешке, листе задатака, IoT подаци са више сензора. Међутим, за продукцију је потребна куповина лиценце.

kotlin
// Упит са више услова
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 бесплатан за комерцијалну употребу?

ObjectBox се дистрибуира под Apache 2.0 лиценцом, која дозвољава комерцијалну употребу без ограничења. Функција ObjectBox Sync (вишеплатформна синхронизација) је власничка и захтева куповину лиценце за продукцију.

Да ли ObjectBox подржава вишенитност?

BoxStore је нитно безбедан: више нити може истовремено читати податке. Писање се блокира на нивоу Box-а. За сложене трансакције користите boxStore.runInTx(), који гарантује атомарност групе операција.

Може ли се ObjectBox користити са Kotlin Multiplatform?

Да, ObjectBox подржава Kotlin Multiplatform (KMP) од верзије 3.0. Доступни су target-и Android, iOS, JVM и Native. За KMP се користи засебан Gradle plugin objectbox-kotlin са подршком за expect/actual.

Како направити резервну копију ObjectBox базе?

ObjectBox чува податке у .mdb датотекама у директоријуму апликације. За резервну копију копирајте цео ObjectBox директоријум кроз BoxStore.copy() или ручно копирајте датотеке након позива boxStore.close(). Живе датотеке се не могу копирати — то ће оштетити податке.

По чему се ObjectBox разликује од Room-а?

Room — ORM изнад SQLite, захтева SQL упите и има додатни напор за мапирање објеката. ObjectBox је NoSQL без SQL-а, знатно бржи, али не подржава сложене JOIN-ове и није релациона база података. Избор зависи од задатка: за релационе податке — Room, за брзо објектно складиштење — ObjectBox.

Закључак

  • ObjectBox — NoSQL база са перформансама 10–100 пута вишим од SQLite на мобилним уређајима
  • Равне датотеке — сопствени SLOT формат без SQL слоја и ORM трошкова
  • Анотације — @Entity, @Id, @Index, @Relation за опис модела података
  • Реактивност — уграђени Observable и Flow за аутоматско ажурирање UI
  • Вишеплатформност — Android, iOS, Linux, macOS, Windows, WebAssembly
  • Кеширање и офлајн — главни сценариј ObjectBox у мобилним апликацијама
  • Препорука — бирајте ObjectBox за задатке где је брзина рада са подацима критичнија од релационог интегритета

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође