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 используется нативный плагин с 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 с conflict resolution по 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. Доступны таргеты Android, iOS, JVM и Native. Для KMP используется отдельный Gradle-плагин objectbox-kotlin с поддержкой expect/actual.
ObjectBox хранит данные в файлах .mdb в директории приложения. Для бэкапа скопируйте всю директорию ObjectBox через BoxStore.copy() или вручную скопируйте файлы после вызова boxStore.close(). Живые файлы копировать нельзя — это повредит данные.
Room — ORM поверх SQLite, требует SQL-запросов и имеет overhead на отображение объектов. ObjectBox — NoSQL без SQL, быстрее на порядок, но не поддерживает сложные JOIN и не является реляционной БД. Выбор зависит от задачи: для реляционных данных — Room, для быстрого объектного хранения — ObjectBox.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также