ObjectBox: vad är det, NoSQL-databas och arbete med data

Författare: IT Sectr Publicerad: 2026-03-13 Lästid: 9 min

ObjectBox är en högpresterande NoSQL-databas optimerad för mobila enheter och edge-enheter. Till skillnad från SQLite använder den sitt eget lagringsformat baserat på platta filer utan SQL-lager. Enligt ObjectBox Benchmarks, 2024, utför ObjectBox insättnings- och läsoperationer 10–100 gånger snabbare än SQLite på Android-enheter, vilket gör det till det bästa valet för högbelastade mobilapplikationer.

Huvudpunkter

  • ObjectBox — NoSQL-databas med platta filer, utan SQL och ORM-lager
  • Prestanda — 10–100 gånger snabbare än SQLite vid skriv- och läsoperationer
  • Plattformsoberoende — Android, iOS, Linux, macOS, Windows och WebAssembly
  • Reaktivitet — inbyggda Observable och Flow för att spåra ändringar
  • Enkel integration — kodgenerering via annoteringar, utan SQL-frågor

Vad är ObjectBox?

ObjectBox är en in-memory NoSQL-databas utvecklad av det tyska företaget ObjectBox.io. Till skillnad från traditionella relationsdatabaser lagrar ObjectBox objekt direkt i platta filer med hjälp av sitt eget SLOT (Super Lightweight Object Tree)-format. Detta eliminerar overhead från ORM och SQL-parser. SLOT-formatet är optimerat för enheter med begränsat minne: data defragmenteras automatiskt och databasstorleken är i genomsnitt 4–6 gånger mindre än en motsvarande SQLite-databas med samma antal poster.

ObjectBox stöder alla större mobila plattformar: Android, iOS och Flutter. För Android finns kodgenerering tillgänglig via ObjectBox Gradle Plugin som bearbetar annoterade entiteter och skapar Box-klasser för att arbeta med data. För Flutter används ett native-plugin med Dart-wrapper. Förutom mobila plattformar fungerar ObjectBox på Linux, macOS, Windows och WebAssembly, vilket gör det möjligt att återanvända datamodellen mellan mobilappen och serversynkronisering.

Enligt forskningsdata från ObjectBox (2023) används databasen i över 5000 applikationer i Google Play, inklusive appar med en publik på över 10 miljoner användare. Huvudscenarier: datacachning, arbete i offlineläge och lagring av tidsserier (IoT). ObjectBox är särskilt populärt i hälso- och fitnessappar, där snabb registrering av sensordata på enheten utan permanent internetanslutning och insamling av analysdata från flera enheter krävs.

Historia och positionering

ObjectBox uppstod som ett alternativ till Realm och SQLite för Android-plattformen. Den första stabila versionen släpptes 2018. Huvudskillnaden från Realm: ObjectBox har inga GPL-begränsningar (använder Apache 2.0) och stöder fler plattformar: från mobila enheter till Linux-servrar.

Huvudfunktioner

ObjectBox erbjuder: automatisk generering av Box-klasser, inbyggda index för snabb sökning, transaktioner med återställningsstöd, reaktiva frågor via RxJava och Kotlin Flow, samt synkronisering mellan enheter via ObjectBox Sync (proprietärt protokoll). Till skillnad från Firebase Realtime Database fungerar ObjectBox Sync i en peer-to-peer-modell utan central server, vilket minskar latens och infrastrukturkostnader.

Hur fungerar ObjectBox?

ObjectBox lagrar data i sitt eget binära .mdb (ObjectBox Data File)-format. Varje entitet mappas till en fil, där poster lagras sekventiellt med en fast offset. Detta gör det möjligt att läsa och skriva enskilda objekt utan att skanna hela filen.

För att arbeta med ObjectBox behövs ingen SQL: frågor byggs via fluent-API i koden. Kompilatorn genererar hjälpklasser MyObjectBox och lådor (Box) som kapslar in alla CRUD-operationer. Datamodellen beskrivs via annoteringar @Entity, @Id, @Index och @Relation.

kotlin
// Ansluta ObjectBox i Android
class App: Application() {
    lateinit var boxStore: BoxStore

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

ObjectBox vs SQLite: prestandajämförelse

Enligt officiella prestandamätningar överträffar ObjectBox SQLite avsevärt i operationshastighet, särskilt vid batchinsättning och massläsning. SQLite förblir dock de facto-standarden för mobilapplikationer tack vare sin spridning och inbyggda SQL-stöd.

OperationObjectBoxSQLiteSkillnad
Insättning (1000 poster)~5 ms~180 msx36 snabbare
Läsning (1000 poster)~3 ms~70 msx23 snabbare
Uppdatering (1000 poster)~6 ms~150 msx25 snabbare
Sökning med index~0.1 ms~2 msx20 snabbare
Databasstorlek (1000 objekt)~28 KB~112 KB4 gånger mindre

När ObjectBox inte är optimalt

ObjectBox förlorar mot SQLite i scenarier där komplexa JOIN-frågor, aggregeringsfunktioner (SUM, COUNT med gruppering) eller integration med ett befintligt SQL-schema behövs. Om projektet redan använder SQLite med Room ORM kommer migration till ObjectBox att kräva omskrivning av all dataåtkomstlogik. ObjectBox stöder inte heller anpassade SQL-frågor — endast fluent-API. För typiska CRUD-operationer och cachning ger ObjectBox dock en prestandaökning på upp till 100 gånger, vilket bekräftas av officiella prestandamätningar på Android-enheter med olika OS-versioner.

Kodexempel med ObjectBox

ObjectBox använder annoteringar för att definiera entiteter. Efter kompilering skapas Box-klasser med metoderna put, get, remove och query. Nedan visas typiska operationer för Task-modellen i en att-göra-lista-app.

Definiera entitet

Varje entitet annoteras med @Entity. Fältet med @Id blir primärnyckel, @Index snabbar upp sökning på fältet. ObjectBox stöder automatisk ID-generering vid värdet 0.

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

CRUD-operationer

Box är huvudklassen för att arbeta med entiteter. Metoden put() sparar eller uppdaterar objektet, get() läser efter ID, remove() tar bort. Alla grundläggande operationer är synkrona och utförs på den anropande tråden.

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

// Skapa
val task = Task(title = "Köp produkter", priority = 3)
val newId = taskBox.put(task)

// Läsa
val savedTask = taskBox.get(newId)

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

// Ta bort
taskBox.remove(newId)

Reaktiva frågor

ObjectBox stöder reaktiva frågor via .subscribe(). Prenumeranten får meddelanden vid varje ändring av data som matchar frågevillkoret. Detta är praktiskt för UI som automatiskt uppdaterar listan när element läggs till eller tas bort.

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

query.subscribe { tasks ->
    // tasks — List, uppdateras automatiskt
    updateUi(tasks)
}

Relationer och frågor i ObjectBox

ObjectBox stöder relationer mellan entiteter — To-One, To-Many och Many-to-Many. Relationer definieras via annoteringen @Relation. Till skillnad från SQLite använder ObjectBox inte främmande nycklar: relationer implementeras via ID-listor i platta filer, vilket snabbar upp navigering i objektdiagrammet.

One-to-Many via @Backlink

Relationen @Backlink gör det möjligt att gå från en underordnad entitet till den överordnade utan ett separat referensfält. ObjectBox upprätthåller automatiskt bakåtreferensen, vilket eliminerar dataduplicering och synkronisering mellan två tabeller.

Fluent-frågor

ObjectBox Query Builder gör det möjligt att bygga kedjor av villkor: equal, notEqual, greater, less, in, contains, startsWith. Alla villkor kombineras via and/or. Resultatet kan sorteras, begränsas och erhållas som List eller LazyList (för stora datamängder).

Konfigurering av index för snabbare sökning

ObjectBox indexerar automatiskt fältet @Id. För anpassade index, använd annoteringen @Index på fält som ofta efterfrågas. Index snabbar upp equal- och in-frågor men saktar ner insättning — indexera inte fält som inte söks på. ObjectBox stöder sammansatta index för samtidig filtrering på flera fält. Sammansatta index är särskilt användbara för filter i listor: till exempel utförs sökning efter ofullständiga uppgifter med hög prioritet tiotals gånger snabbare med ett sammansatt index på fälten isCompleted och priority.

ObjectBox Sync — synkronisering mellan enheter

ObjectBox Sync är en proprietär teknik för datasynkronisering i realtid mellan enheter. Den använder ett WebSocket-baserat protokoll med konfliktlösning enligt last-writer-wins. Sync passar för appar som behöver offlinesynkronisering: anteckningar, att-göra-listor, IoT-data från flera sensorer. För produktion krävs dock licensköp.

kotlin
// Fråga med flera villkor
val highPriorityIncomplete = taskBox.query()
    .greater(Task_.priority, 5)
    .equal(Task_.isCompleted, false)
    .build()
    .find()

// Sökning efter delsträng
val searchResults = taskBox.query()
    .contains(Task_.title, "produkt", StringOrder.CASE_INSENSITIVE)
    .build()
    .find()

Vanliga frågor

Är ObjectBox gratis för kommersiellt bruk?

ObjectBox distribueras under Apache 2.0-licensen, vilket tillåter kommersiell användning utan begränsningar. Funktionen ObjectBox Sync (plattformsoberoende synkronisering) är proprietär och kräver licensköp för produktion.

Stöder ObjectBox flertrådning?

BoxStore är trådsäkert: flera trådar kan samtidigt läsa data. Skrivning blockeras på Box-nivå. För komplexa transaktioner använd boxStore.runInTx() som garanterar atomaritet för en grupp operationer.

Kan ObjectBox användas med Kotlin Multiplatform?

Ja, ObjectBox stöder Kotlin Multiplatform (KMP) från version 3.0. Målen Android, iOS, JVM och Native är tillgängliga. För KMP används ett separat Gradle-plugin objectbox-kotlin med expect/actual-stöd.

Hur gör jag en säkerhetskopia av ObjectBox-databasen?

ObjectBox lagrar data i .mdb-filer i appens katalog. För säkerhetskopiering, kopiera hela ObjectBox-katalogen via BoxStore.copy() eller manuellt efter anrop av boxStore.close(). Live-filer kan inte kopieras — det skulle skada data.

Hur skiljer sig ObjectBox från Room?

Room är ORM ovanpå SQLite, kräver SQL-frågor och har overhead för objektmappning. ObjectBox är NoSQL utan SQL, mycket snabbare, men stöder inte komplexa JOIN och är inte en relationsdatabas. Valet beror på uppgiften: för relationsdata — Room, för snabb objektlagring — ObjectBox.

Sammanfattning

  • ObjectBox — NoSQL-databas med 10–100 gånger högre prestanda än SQLite på mobila enheter
  • Platta filer — eget SLOT-format utan SQL-lager och ORM-kostnader
  • Annoteringar — @Entity, @Id, @Index, @Relation för att beskriva datamodellen
  • Reaktivitet — inbyggda Observable och Flow för automatisk UI-uppdatering
  • Plattformsoberoende — Android, iOS, Linux, macOS, Windows, WebAssembly
  • Cachning och offline — huvudscenariot för ObjectBox i mobilappar
  • Rekommendation — välj ObjectBox för uppgifter där datahanteringshastigheten är viktigare än relationsintegritet

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också