ObjectBox: qué es, BD NoSQL y trabajo con datos

Autor: IT Sectr Publicado: 2026-03-13 Tiempo de lectura: 9 min

ObjectBox es una base de datos NoSQL de alto rendimiento optimizada para dispositivos móviles y edge. A diferencia de SQLite, utiliza su propio formato de almacenamiento de archivos planos sin capa SQL. Según ObjectBox Benchmarks, 2024, ObjectBox realiza operaciones de inserción y lectura entre 10 y 100 veces más rápido que SQLite en dispositivos Android, lo que lo convierte en la mejor opción para aplicaciones móviles de alta carga.

Puntos clave

  • ObjectBox — BD NoSQL con archivos planos, sin SQL ni capa ORM
  • Rendimiento — de 10 a 100 veces más rápido que SQLite en operaciones de escritura y lectura
  • Multiplataforma — Android, iOS, Linux, macOS, Windows y WebAssembly
  • Reactividad — Observable y Flow integrados para seguimiento de cambios
  • Integración sencilla — generación de código mediante anotaciones, sin consultas SQL

¿Qué es ObjectBox?

ObjectBox es una base de datos NoSQL en memoria desarrollada por la empresa alemana ObjectBox.io. A diferencia de las bases de datos relacionales tradicionales, ObjectBox almacena objetos directamente en archivos planos utilizando su propio formato SLOT (Super Lightweight Object Tree). Esto elimina la sobrecarga del ORM y el análisis SQL. El formato SLOT está optimizado para dispositivos con memoria limitada: los datos se desfragmentan automáticamente y el tamaño de la BD es en promedio de 4 a 6 veces menor que una base de datos SQLite equivalente con el mismo número de registros.

ObjectBox admite todas las principales plataformas móviles: Android, iOS y Flutter. Para Android, la generación de código está disponible a través del ObjectBox Gradle Plugin, que procesa entidades anotadas y crea clases Box para trabajar con datos. Para Flutter se utiliza un plugin nativo con envoltorio Dart. Además de las plataformas móviles, ObjectBox funciona en Linux, macOS, Windows y WebAssembly, lo que permite reutilizar el modelo de datos entre la aplicación móvil y la sincronización del servidor.

Según un estudio de ObjectBox (2023), la base de datos se utiliza en más de 5.000 aplicaciones en Google Play, incluidas aplicaciones con más de 10 millones de usuarios. Casos de uso principales: almacenamiento en caché, funcionamiento sin conexión y almacenamiento de series temporales (IoT). ObjectBox es especialmente popular en aplicaciones de seguimiento de salud y fitness que requieren un registro rápido de lecturas de sensores en el dispositivo sin conexión constante a Internet y para recopilar análisis de múltiples dispositivos.

Historia y posicionamiento

ObjectBox surgió como alternativa a Realm y SQLite para la plataforma Android. La primera versión estable se lanzó en 2018. La diferencia clave con Realm es que ObjectBox no tiene restricciones GPL (utiliza Apache 2.0) y admite más plataformas: desde dispositivos móviles hasta servidores Linux.

Características principales

ObjectBox proporciona: generación automática de clases Box, índices integrados para búsqueda rápida, transacciones con soporte de reversión, consultas reactivas a través de RxJava y Kotlin Flow, y sincronización entre dispositivos mediante ObjectBox Sync (protocolo propietario). A diferencia de Firebase Realtime Database, ObjectBox Sync funciona con un modelo peer-to-peer sin servidor central, lo que reduce la latencia y los costos de infraestructura.

¿Cómo funciona ObjectBox?

ObjectBox almacena datos en su propio formato binario .mdb (ObjectBox Data File). Cada entidad se asigna a un archivo, donde los registros se almacenan secuencialmente con un desplazamiento fijo. Esto permite leer y escribir objetos individuales sin escanear el archivo completo.

Trabajar con ObjectBox no requiere SQL: las consultas se construyen a través de una API fluida en el código. El compilador genera clases auxiliares MyObjectBox y Boxes que encapsulan todas las operaciones CRUD. El modelo de datos se describe mediante anotaciones @Entity, @Id, @Index y @Relation.

kotlin
// Connecting ObjectBox in Android
class App: Application() {
    lateinit var boxStore: BoxStore

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

ObjectBox vs SQLite: comparativa de rendimiento

Según los benchmarks oficiales, ObjectBox supera significativamente a SQLite en velocidad, especialmente en inserciones por lotes y lecturas masivas. Sin embargo, SQLite sigue siendo el estándar de facto para aplicaciones móviles debido a su prevalencia y soporte SQL integrado.

OperaciónObjectBoxSQLiteDiferencia
Inserción (1000 registros)~5 ms~180 msx36 más rápido
Lectura (1000 registros)~3 ms~70 msx23 más rápido
Actualización (1000 registros)~6 ms~150 msx25 más rápido
Búsqueda por índice~0.1 ms~2 msx20 más rápido
Tamaño de BD (1000 objetos)~28 KB~112 KB4 veces menor

Cuándo ObjectBox no es óptimo

ObjectBox es inferior a SQLite en escenarios que requieren consultas JOIN complejas, funciones agregadas (SUM, COUNT con agrupación) o integración con un esquema SQL existente. Si el proyecto ya usa SQLite con Room ORM, migrar a ObjectBox requerirá reescribir toda la lógica de acceso a datos. ObjectBox tampoco admite consultas SQL personalizadas, solo API fluida. Sin embargo, para operaciones CRUD típicas y almacenamiento en caché, ObjectBox proporciona una mejora de rendimiento de hasta 100 veces, según lo confirmado por benchmarks oficiales en dispositivos Android con diferentes versiones del sistema operativo.

Ejemplos de código con ObjectBox

ObjectBox utiliza anotaciones para definir entidades. Después de la compilación, se crean clases Box con métodos put, get, remove y query. A continuación se muestran operaciones típicas para un modelo Task en una aplicación de lista de tareas.

Definición de una entidad

Cada entidad se anota con @Entity. Un campo con @Id se convierte en la clave primaria, y @Index acelera las búsquedas en ese campo. ObjectBox admite la generación automática de ID cuando el valor es 0.

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

Operaciones CRUD

Box es la clase principal para trabajar con entidades. El método put() guarda o actualiza un objeto, get() lee por ID y remove() elimina. Todas las operaciones básicas son síncronas y se ejecutan en el hilo de llamada.

kotlin
val taskBox: Box<Task> = boxStore.boxFor(Task::class.java)

// Create
val task = Task(title = "Buy products", priority = 3)
val newId = taskBox.put(task)

// Read
val savedTask = taskBox.get(newId)

// Update
savedTask.isCompleted = true
taskBox.put(savedTask)

// Delete
taskBox.remove(newId)

Consultas reactivas

ObjectBox admite consultas reactivas a través de .subscribe(). El suscriptor recibe notificaciones cuando los datos que coinciden con la condición de la consulta cambian. Esto es conveniente para la interfaz de usuario que actualiza automáticamente la lista cuando se agregan o eliminan elementos.

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

query.subscribe { tasks ->
    // tasks — List, se actualiza automáticamente
    updateUi(tasks)
}

Relaciones y consultas en ObjectBox

ObjectBox admite relaciones entre entidades: uno a uno, uno a muchos y muchos a muchos. Las relaciones se definen mediante la anotación @Relation. A diferencia de SQLite, ObjectBox no utiliza claves externas: las relaciones se implementan a través de listas de ID en archivos planos, lo que acelera el recorrido del grafo de objetos.

Uno a muchos mediante @Backlink

La relación @Backlink permite recorrer desde una entidad hija hasta su padre sin un campo de referencia separado. ObjectBox mantiene automáticamente el backlink, eliminando la duplicación de datos y la sincronización entre dos tablas.

Consultas fluidas

ObjectBox Query Builder permite construir cadenas de condiciones: equal, notEqual, greater, less, in, contains, startsWith. Todas las condiciones se pueden combinar mediante and/or. El resultado se puede ordenar, limitar y obtener como List o LazyList (para conjuntos de datos grandes).

Configuración de índices para búsqueda más rápida

ObjectBox indexa automáticamente el campo @Id. Para índices personalizados, use la anotación @Index en campos que se consultan con frecuencia. Los índices aceleran las consultas equal e in pero ralentizan las inserciones: no indexe campos que no se buscan. ObjectBox admite índices compuestos para filtrar por múltiples campos simultáneamente. Los índices compuestos son especialmente útiles para filtros de listas: por ejemplo, buscar tareas incompletas con alta prioridad es decenas de veces más rápido con un índice compuesto en los campos isCompleted y priority.

ObjectBox Sync — sincronización entre dispositivos

ObjectBox Sync es una tecnología propietaria para la sincronización de datos en tiempo real entre dispositivos. Utiliza un protocolo basado en WebSocket con resolución de conflictos por último escritor. Sync es adecuado para aplicaciones que necesitan sincronización sin conexión: notas, listas de tareas, datos IoT de múltiples sensores. Sin embargo, se requiere la compra de una licencia para producción.

kotlin
// Query with multiple conditions
val highPriorityIncomplete = taskBox.query()
    .greater(Task_.priority, 5)
    .equal(Task_.isCompleted, false)
    .build()
    .find()

// Substring search
val searchResults = taskBox.query()
    .contains(Task_.title, "product", StringOrder.CASE_INSENSITIVE)
    .build()
    .find()

Preguntas frecuentes

¿ObjectBox es gratuito para uso comercial?

ObjectBox se distribuye bajo la licencia Apache 2.0, que permite el uso comercial sin restricciones. La función ObjectBox Sync (sincronización multiplataforma) es propietaria y requiere la compra de una licencia para producción.

¿ObjectBox admite subprocesos múltiples?

BoxStore es seguro para subprocesos: múltiples subprocesos pueden leer datos simultáneamente. Las escrituras se bloquean a nivel de Box. Para transacciones complejas, use boxStore.runInTx(), que garantiza la atomicidad de un grupo de operaciones.

¿Se puede usar ObjectBox con Kotlin Multiplatform?

Sí, ObjectBox admite Kotlin Multiplatform (KMP) a partir de la versión 3.0. Los objetivos disponibles son Android, iOS, JVM y Native. Para KMP se utiliza un complemento Gradle independiente objectbox-kotlin con soporte expect/actual.

¿Cómo hacer una copia de seguridad de la base de datos ObjectBox?

ObjectBox almacena datos en archivos .mdb en el directorio de la aplicación. Para la copia de seguridad, copie todo el directorio de ObjectBox mediante BoxStore.copy() o copie manualmente los archivos después de llamar a boxStore.close(). Los archivos activos no se pueden copiar, ya que esto dañaría los datos.

¿En qué se diferencia ObjectBox de Room?

Room es un ORM sobre SQLite, requiere consultas SQL y tiene sobrecarga de mapeo de objetos. ObjectBox es una base de datos NoSQL sin SQL, un orden de magnitud más rápida, pero no admite JOIN complejos ni es una base de datos relacional. La elección depende de la tarea: para datos relacionales — Room, para almacenamiento rápido de objetos — ObjectBox.

Resumen

  • ObjectBox — BD NoSQL con rendimiento 10–100 veces superior a SQLite en dispositivos móviles
  • Archivos planos — formato SLOT propietario sin capa SQL ni sobrecarga ORM
  • Anotaciones — @Entity, @Id, @Index, @Relation para describir el modelo de datos
  • Reactividad — Observable y Flow integrados para actualización automática de la interfaz
  • Multiplataforma — Android, iOS, Linux, macOS, Windows, WebAssembly
  • Almacenamiento en caché y sin conexión — caso de uso principal de ObjectBox en aplicaciones móviles
  • Recomendación — elija ObjectBox para tareas donde la velocidad de acceso a datos es más crítica que la integridad relacional

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también