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 используется нативный плагин с 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 KBв 4 раза меньше

Когда 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 с conflict resolution по 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. Доступны таргеты Android, iOS, JVM и Native. Для KMP используется отдельный Gradle-плагин objectbox-kotlin с поддержкой expect/actual.

Как сделать бэкап базы ObjectBox?

ObjectBox хранит данные в файлах .mdb в директории приложения. Для бэкапа скопируйте всю директорию ObjectBox через BoxStore.copy() или вручную скопируйте файлы после вызова boxStore.close(). Живые файлы копировать нельзя — это повредит данные.

Чем ObjectBox отличается от Room?

Room — ORM поверх SQLite, требует SQL-запросов и имеет overhead на отображение объектов. 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также