ObjectBox: nedir, NoSQL DB ve verilerle çalışma

Yazar: IT Sectr Yayınlanma: 2026-03-13 Okuma süresi: 9 dk

ObjectBox, mobil ve uç cihazlar için optimize edilmiş yüksek performanslı bir NoSQL veritabanıdır. SQLite'ın aksine, SQL katmanı olmadan kendi düz dosya depolama biçimini kullanır. ObjectBox Benchmarks, 2024'e göre, ObjectBox Android cihazlarda ekleme ve okuma işlemlerini SQLite'dan 10–100 kat daha hızlı gerçekleştirir ve bu da onu yüksek yük altındaki mobil uygulamalar için en iyi seçim haline getirir.

Önemli Noktalar

  • ObjectBox — SQL veya ORM katmanı olmadan düz dosyalarla NoSQL DB
  • Performans — yazma ve okuma işlemlerinde SQLite'dan 10–100 kat daha hızlı
  • Çapraz platform — Android, iOS, Linux, macOS, Windows ve WebAssembly
  • Tepkisellik — değişiklik takibi için yerleşik Observable ve Flow
  • Kolay entegrasyon — SQL sorguları olmadan ek açıklamalar yoluyla kod oluşturma

ObjectBox nedir?

ObjectBox, Alman şirketi ObjectBox.io tarafından geliştirilen bir bellek içi NoSQL veritabanıdır. Geleneksel ilişkisel veritabanlarının aksine ObjectBox, kendi SLOT (Super Lightweight Object Tree) biçimini kullanarak nesneleri doğrudan düz dosyalarda saklar. Bu, ORM ve SQL ayrıştırma yükünü ortadan kaldırır. SLOT biçimi, sınırlı belleğe sahip cihazlar için optimize edilmiştir: veriler otomatik olarak birleştirilir ve veritabanı boyutu, aynı sayıda kayda sahip eşdeğer bir SQLite veritabanından ortalama 4–6 kat daha küçüktür.

ObjectBox tüm önemli mobil platformları destekler: Android, iOS ve Flutter. Android için, ek açıklamalı varlıkları işleyen ve verilerle çalışmak için Box sınıfları oluşturan ObjectBox Gradle Plugin aracılığıyla kod oluşturma mevcuttur. Flutter için, Dart sarmalayıcılı yerel bir eklenti kullanılır. Mobil platformların yanı sıra ObjectBox, Linux, macOS, Windows ve WebAssembly'de de çalışarak mobil uygulama ile sunucu senkronizasyonu arasında veri modelinin yeniden kullanılmasına olanak tanır.

ObjectBox araştırmasına (2023) göre, veritabanı Google Play'de 5.000'den fazla uygulamada kullanılmaktadır ve 10 milyondan fazla kullanıcıya sahip uygulamaları da içerir. Başlıca kullanım alanları: veri önbelleğe alma, çevrimdışı çalışma ve zaman serisi depolama (IoT). ObjectBox, özellikle sürekli internet bağlantısı olmadan cihazdaki sensör okumalarının hızlı kaydedilmesini ve birden fazla cihazdan analiz toplanmasını gerektiren sağlık ve fitness takip uygulamalarında popülerdir.

Tarihçe ve konumlandırma

ObjectBox, Android platformu için Realm ve SQLite'a bir alternatif olarak ortaya çıktı. İlk kararlı sürüm 2018'de yayınlandı. Realm'den temel farkı, ObjectBox'un GPL kısıtlamalarının olmaması (Apache 2.0 kullanır) ve mobil cihazlardan Linux sunucularına kadar daha fazla platformu desteklemesidir.

Temel özellikler

ObjectBox şunları sağlar: otomatik Box sınıfı oluşturma, hızlı arama için yerleşik dizinler, geri alma desteğiyle işlemler, RxJava ve Kotlin Flow aracılığıyla reaktif sorgular ve ObjectBox Sync (özel protokol) aracılığıyla cihazlar arası senkronizasyon. Firebase Realtime Database'in aksine ObjectBox Sync, merkezi bir sunucu olmadan eşler arası modelde çalışarak gecikmeyi ve altyapı maliyetlerini azaltır.

ObjectBox nasıl çalışır?

ObjectBox, verileri kendi ikili biçimi .mdb (ObjectBox Data File) içinde saklar. Her varlık, kayıtların sabit bir ofsetle sıralı olarak depolandığı bir dosyaya eşlenir. Bu, dosyanın tamamını taramadan tek tek nesnelerin okunmasına ve yazılmasına olanak tanır.

ObjectBox ile çalışmak SQL gerektirmez: sorgular, kodda akıcı bir API aracılığıyla oluşturulur. Derleyici, tüm CRUD işlemlerini kapsayan yardımcı sınıflar MyObjectBox ve Boxes oluşturur. Veri modeli, ek açıklamalar @Entity, @Id, @Index ve @Relation kullanılarak tanımlanır.

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: performans karşılaştırması

Resmi karşılaştırmalara göre, ObjectBox özellikle toplu ekleme ve toplu okumalarda SQLite'ı önemli ölçüde geride bırakır. Ancak SQLite, yaygınlığı ve yerleşik SQL desteği nedeniyle mobil uygulamalar için fiili standart olmaya devam etmektedir.

İşlemObjectBoxSQLiteFark
Ekleme (1000 kayıt)~5 ms~180 ms×36 daha hızlı
Okuma (1000 kayıt)~3 ms~70 ms×23 daha hızlı
Güncelleme (1000 kayıt)~6 ms~150 ms×25 daha hızlı
Dizin arama~0.1 ms~2 ms×20 daha hızlı
DB boyutu (1000 nesne)~28 KB~112 KB4 kat daha küçük

ObjectBox ne zaman optimal değildir

ObjectBox, karmaşık JOIN sorguları, toplama işlevleri (gruplamalı SUM, COUNT) veya mevcut bir SQL şemasıyla entegrasyon gerektiren senaryolarda SQLite'ın gerisinde kalır. Proje zaten Room ORM ile SQLite kullanıyorsa, ObjectBox'a geçiş tüm veri erişim mantığının yeniden yazılmasını gerektirecektir. ObjectBox ayrıca özel SQL sorgularını da desteklemez — yalnızca akıcı API. Bununla birlikte, tipik CRUD işlemleri ve önbelleğe alma için ObjectBox, farklı işletim sistemi sürümlerine sahip Android cihazlarda resmi karşılaştırmalarla onaylandığı üzere 100 kata kadar performans iyileştirmesi sağlar.

ObjectBox ile kod örnekleri

ObjectBox, varlıkları tanımlamak için ek açıklamalar kullanır. Derlemeden sonra, put, get, remove ve query yöntemlerine sahip Box sınıfları oluşturulur. Aşağıda, bir yapılacaklar listesi uygulamasındaki Task modeli için tipik işlemler verilmiştir.

Bir varlık tanımlama

Her varlık @Entity ile ek açıklamalıdır. @Id içeren bir alan birincil anahtar olur ve @Index bu alandaki aramaları hızlandırır. ObjectBox, değer 0 olduğunda otomatik ID oluşturmayı destekler.

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

CRUD işlemleri

Box, varlıklarla çalışmak için ana sınıftır. put() yöntemi bir nesneyi kaydeder veya günceller, get() ID'ye göre okur ve remove() siler. Tüm temel işlemler senkrondur ve çağıran iş parçacığında yürütülür.

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)

Reaktif sorgular

ObjectBox, .subscribe() aracılığıyla reaktif sorguları destekler. Abone, sorgu koşuluyla eşleşen veriler değiştiğinde bildirim alır. Bu, öğeler eklendiğinde veya kaldırıldığında listeyi otomatik olarak güncelleyen kullanıcı arayüzü için kullanışlıdır.

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

query.subscribe { tasks ->
    // tasks — List, otomatik güncellenir
    updateUi(tasks)
}

ObjectBox'da ilişkiler ve sorgular

ObjectBox, varlıklar arasında ilişkileri destekler — Bire-Bir, Bire-Çok ve Çoktan-Çoğa. İlişkiler @Relation ek açıklamasıyla tanımlanır. SQLite'ın aksine ObjectBox, yabancı anahtarlar kullanmaz: ilişkiler, düz dosyalardaki ID listeleri aracılığıyla uygulanır ve bu da nesne grafiğinde gezinmeyi hızlandırır.

@Backlink ile Bire-Çok

@Backlink ilişkisi, ayrı bir referans alanı olmadan alt varlıktan üst varlığa geçmeye olanak tanır. ObjectBox, geri bağlantıyı otomatik olarak koruyarak veri tekrarını ve iki tablo arasındaki senkronizasyonu ortadan kaldırır.

Akıcı sorgular

ObjectBox Query Builder, koşul zincirleri oluşturmaya olanak tanır: equal, notEqual, greater, less, in, contains, startsWith. Tüm koşullar and/or ile birleştirilebilir. Sonuç sıralanabilir, sınırlanabilir ve List veya LazyList (büyük veri kümeleri için) olarak alınabilir.

Daha hızlı arama için dizin ayarlama

ObjectBox otomatik olarak @Id alanını indeksler. Özel dizinler için, sık sorgulanan alanlarda @Index ek açıklamasını kullanın. Dizinler, equal ve in sorgularını hızlandırır ancak eklemeleri yavaşlatır — aranmayan alanları indekslemeyin. ObjectBox, aynı anda birden çok alana göre filtreleme yapmak için bileşik dizinleri destekler. Bileşik dizinler, özellikle liste filtreleri için kullanışlıdır: örneğin, isCompleted ve priority alanlarında bileşik dizin ile yüksek öncelikli tamamlanmamış görevleri aramak onlarca kat daha hızlıdır.

ObjectBox Sync — cihazlar arası senkronizasyon

ObjectBox Sync, cihazlar arasında gerçek zamanlı veri senkronizasyonu için özel bir teknolojidir. Son yazan kazanır ile çakışma çözümlemesiyle WebSocket tabanlı bir protokol kullanır. Sync, çevrimdışı senkronizasyon gerektiren uygulamalar için uygundur: notlar, görev listeleri, birden fazla sensörden IoT verileri. Ancak, üretim için bir lisans satın alınması gerekir.

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()

Sıkça Sorulan Sorular

ObjectBox ticari kullanım için ücretsiz mi?

ObjectBox, kısıtlama olmaksızın ticari kullanıma izin veren Apache 2.0 lisansı altında dağıtılır. ObjectBox Sync özelliği (çapraz platform senkronizasyonu) özeldir ve üretim için lisans satın alınmasını gerektirir.

ObjectBox çoklu iş parçacığını destekliyor mu?

BoxStore iş parçacığı güvenlidir: birden çok iş parçacığı aynı anda veri okuyabilir. Yazmalar Box düzeyinde kilitlenir. Karmaşık işlemler için, bir grup işlemin atomikliğini garanti eden boxStore.runInTx() işlevini kullanın.

ObjectBox Kotlin Multiplatform ile kullanılabilir mi?

Evet, ObjectBox sürüm 3.0'dan itibaren Kotlin Multiplatform'u (KMP) destekler. Android, iOS, JVM ve Native hedefleri mevcuttur. KMP için, expect/actual desteğine sahip ayrı bir Gradle eklentisi objectbox-kotlin kullanılır.

ObjectBox veritabanı nasıl yedeklenir?

ObjectBox, uygulama dizinindeki .mdb dosyalarında veri saklar. Yedekleme için, BoxStore.copy() ile tüm ObjectBox dizinini kopyalayın veya boxStore.close() çağrısından sonra dosyaları manuel olarak kopyalayın. Canlı dosyalar kopyalanamaz — bu verileri bozar.

ObjectBox Room'dan nasıl farklıdır?

Room, SQLite üzerine bir ORM'dir, SQL sorguları gerektirir ve nesne eşleme yüküne sahiptir. ObjectBox, SQL'siz bir NoSQL veritabanıdır, bir büyüklük sırası daha hızlıdır ancak karmaşık JOIN'leri desteklemez ve ilişkisel bir veritabanı değildir. Seçim, göreve bağlıdır: ilişkisel veriler için — Room, hızlı nesne depolama için — ObjectBox.

Özet

  • ObjectBox — mobil cihazlarda SQLite'dan 10–100 kat daha iyi performansa sahip NoSQL DB
  • Düz dosyalar — SQL katmanı ve ORM yükü olmadan özel SLOT biçimi
  • Ek açıklamalar — veri modeli tanımı için @Entity, @Id, @Index, @Relation
  • Tepkisellik — otomatik UI güncellemesi için yerleşik Observable ve Flow
  • Çapraz platform — Android, iOS, Linux, macOS, Windows, WebAssembly
  • Önbelleğe alma ve çevrimdışı — mobil uygulamalarda ObjectBox'un birincil kullanım durumu
  • Öneri — veri erişim hızının ilişkisel bütünlükten daha kritik olduğu görevler için ObjectBox'u seçin

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun