ObjectBox — yuqori samaradorlikka ega NoSQL ma'lumotlar bazasi bo'lib, mobil va edge qurilmalari uchun optimallashtirilgan. SQLite dan farqli o'laroq, u SQL qatlamisiz tekis fayllarga asoslangan o'zining saqlash formatidan foydalanadi. ObjectBox Benchmarks, 2024 ma'lumotlariga ko'ra, ObjectBox Android qurilmalarida qo'shish va o'qish amallarini SQLite dan 10–100 marta tezroq bajaradi, bu esa uni yuqori yuklamali mobil ilovalar uchun eng yaxshi tanlovga aylantiradi.
Asosiy fikrlar
ObjectBox — nemis ObjectBox.io kompaniyasi tomonidan ishlab chiqilgan in-memory NoSQL ma'lumotlar bazasi. An'anaviy relyatsion ma'lumotlar bazalaridan farqli o'laroq, ObjectBox ob'ektlarni to'g'ridan-to'g'ri tekis fayllarda, o'zining SLOT (Super Lightweight Object Tree) formatidan foydalanib saqlaydi. Bu ORM va SQL parserining yukini bartaraf qiladi. SLOT formati cheklangan xotiraga ega qurilmalarda ishlash uchun optimallashtirilgan: ma'lumotlar avtomatik defragmentatsiya qilinadi va MB hajmi bir xil miqdordagi yozuvlarga ega ekvivalent SQLite bazasidan o'rtacha 4–6 marta kichikroq.
ObjectBox barcha asosiy mobil platformalarni qo'llab-quvvatlaydi: Android, iOS va Flutter. Android uchun kod generatsiyasi ObjectBox Gradle Plugin orqali mavjud bo'lib, u annotatsiya qilingan entity-larni qayta ishlaydi va ma'lumotlar bilan ishlash uchun Box sinflarini yaratadi. Flutter uchun Dart o'rami bilan native plagin ishlatiladi. Mobil platformalardan tashqari, ObjectBox Linux, macOS, Windows va WebAssembly da ishlaydi, bu esa ma'lumotlar modelini mobil ilova va server sinxronizatsiyasi o'rtasida qayta ishlatish imkonini beradi.
ObjectBox (2023) tadqiqot ma'lumotlariga ko'ra, ma'lumotlar bazasi Google Play da 5000 dan ortiq ilovalarda, jumladan 10 milliondan ortiq foydalanuvchiga ega ilovalarda qo'llaniladi. Asosiy stsenariylar: ma'lumotlarni keshlashtirish, oflayn rejimda ishlash va vaqt seriyalarini saqlash (IoT). ObjectBox, ayniqsa, sog'liqni kuzatish va fitnes ilovalarida mashhur bo'lib, bunda doimiy internet aloqasisiz qurilmada sensor ko'rsatkichlarini tez yozib olish va bir nechta qurilmalardan analitika to'plash talab qilinadi.
ObjectBox Android platformasi uchun Realm va SQLite ga alternativa sifatida paydo bo'ldi. Birinchi barqaror versiya 2018 yilda chiqarilgan. Realm dan asosiy farq — ObjectBox da GPL cheklovlari yo'q (Apache 2.0 ishlatiladi) va ko'proq platformalarni qo'llab-quvvatlaydi: mobil qurilmalardan Linux serverlarigacha.
ObjectBox ta'minlaydi: Box sinflarining avtomatik generatsiyasi, tez qidirish uchun o'rnatilgan indekslar, qaytarish qo'llab-quvvatlashi bilan tranzaksiyalar, RxJava va Kotlin Flow orqali reaktiv so'rovlar, shuningdek ObjectBox Sync (xususiy protokol) orqali qurilmalar o'rtasida sinxronizatsiya. Firebase Realtime Database dan farqli o'laroq, ObjectBox Sync markaziy serversiz peer-to-peer modelida ishlaydi, bu esa kechikishlar va infratuzilma xarajatlarini kamaytiradi.
ObjectBox ma'lumotlarni o'zining ikkilik .mdb (ObjectBox Data File) formatida saqlaydi. Har bir entity (Entity) bir faylga xaritalanadi, unda yozuvlar sobit siljish bilan ketma-ket saqlanadi. Bu faylni to'liq skanerlamasdan alohida ob'ektlarni o'qish va yozish imkonini beradi.
ObjectBox bilan ishlash uchun SQL kerak emas: so'rovlar koddagi fluent-API orqali quriladi. Kompilyator barcha CRUD amallarini inkapsulatsiya qiladigan yordamchi sinflar MyObjectBox va qutilar (Box) yaratadi. Ma'lumotlar modeli annotatsiyalar @Entity, @Id, @Index va @Relation orqali tavsiflanadi.
// ObjectBox-ni Android-ga ulash
class App: Application() {
lateinit var boxStore: BoxStore
override fun onCreate() {
super.onCreate()
boxStore = MyObjectBox.builder()
.androidContext(this)
.build()
}
}
Rasmiy benchmarklarga ko'ra, ObjectBox amallar tezligi bo'yicha SQLite dan sezilarli darajada ustun turadi, ayniqsa ommaviy qo'shish va ommaviy o'qishda. Biroq, SQLite keng tarqalganligi va o'rnatilgan SQL qo'llab-quvvatlashi tufayli mobil ilovalar uchun de-fakto standart bo'lib qolmoqda.
| Amal | ObjectBox | SQLite | Farq |
|---|---|---|---|
| Qo'shish (1000 ta yozuv) | ~5 ms | ~180 ms | x36 tezroq |
| O'qish (1000 ta yozuv) | ~3 ms | ~70 ms | x23 tezroq |
| Yangilash (1000 ta yozuv) | ~6 ms | ~150 ms | x25 tezroq |
| Indeks bo'yicha qidirish | ~0.1 ms | ~2 ms | x20 tezroq |
| MB hajmi (1000 ob'ekt) | ~28 KB | ~112 KB | 4 marta kichik |
ObjectBox murakkab JOIN so'rovlari, agregat funksiyalar (SUM, COUNT guruhlash bilan) yoki mavjud SQL sxemasi bilan integratsiya talab qilinadigan stsenariylarda SQLite dan ortda qoladi. Agar loyiha allaqachon SQLite dan Room ORM bilan foydalanayotgan bo'lsa — ObjectBox ga migratsiya barcha ma'lumotlarga kirish mantiqini qayta yozishni talab qiladi. ObjectBox shuningdek maxsus SQL so'rovlarini qo'llab-quvvatlamaydi — faqat fluent-API. Biroq, odatiy CRUD amallari va keshlashtirish uchun ObjectBox 100 martagacha samaradorlik oshishini beradi, bu turli OS versiyalaridagi Android qurilmalarida rasmiy benchmarklar bilan tasdiqlangan.
ObjectBox entity-larni aniqlash uchun annotatsiyalardan foydalanadi. Kompilyatsiyadan so'ng put, get, remove va query metodlari bilan Box sinflari yaratiladi. Quyida vazifalar ro'yxati ilovasidagi Task modeli uchun odatiy amallar keltirilgan.
Har bir entity @Entity bilan annotatsiya qilinadi. @Id maydoni asosiy kalitga aylanadi, @Index maydon bo'yicha qidirishni tezlashtiradi. ObjectBox 0 qiymatida ID ning avtomatik generatsiyasini qo'llab-quvvatlaydi.
@Entity
data class Task(
@Id var id: Long = 0,
@Index var title: String = "",
var isCompleted: Boolean = false,
var priority: Int = 0
)
Box — entity lar bilan ishlash uchun asosiy sinf. put() metodi ob'ektni saqlaydi yoki yangilaydi, get() ID bo'yicha o'qiydi, remove() o'chiradi. Barcha asosiy amallar sinxron bo'lib, chaqiruvchi thread da bajariladi.
val taskBox: Box<Task> = boxStore.boxFor(Task::class.java)
// Yaratish
val task = Task(title = "Mahsulotlarni sotib olish", priority = 3)
val newId = taskBox.put(task)
// O'qish
val savedTask = taskBox.get(newId)
// Yangilash
savedTask.isCompleted = true
taskBox.put(savedTask)
// O'chirish
taskBox.remove(newId)
ObjectBox .subscribe() orqali reaktiv so'rovlarni qo'llab-quvvatlaydi. Obunachi so'rov shartiga mos keladigan ma'lumotlardagi har qanday o'zgarish haqida bildirishnoma oladi. Bu elementlar qo'shilganda yoki o'chirilganda ro'yxatni avtomatik yangilaydigan UI uchun qulay.
val query = taskBox.query()
.equal(Task_.isCompleted, false)
.orderDesc(Task_.priority)
.build()
query.subscribe { tasks ->
// tasks — List, avtomatik yangilanadi
updateUi(tasks)
}
ObjectBox entity lar o'rtasida aloqalarni qo'llab-quvvatlaydi — To-One, To-Many va Many-to-Many. Aloqalar @Relation annotatsiyasi orqali belgilanadi. SQLite dan farqli o'laroq, ObjectBox tashqi kalitlardan foydalanmaydi: aloqalar tekis fayllardagi ID ro'yxatlari orqali amalga oshiriladi, bu ob'ekt grafi bo'ylab navigatsiyani tezlashtiradi.
@Backlink aloqasi alohida havola maydonisiz bola entity dan ota-onaga o'tish imkonini beradi. ObjectBox avtomatik ravishda teskari havolani saqlaydi, bu ma'lumotlarning takrorlanishini va ikki jadval o'rtasidagi sinxronizatsiyani bartaraf qiladi.
ObjectBox Query Builder shartlar zanjirini qurish imkonini beradi: equal, notEqual, greater, less, in, contains, startsWith. Barcha shartlar and/or orqali birlashtiriladi. Natijani saralash, cheklash va List yoki LazyList (katta ma'lumotlar to'plami uchun) sifatida olish mumkin.
ObjectBox @Id maydonini avtomatik indekslaydi. Maxsus indekslar uchun tez-tez so'raladigan maydonlarda @Index annotatsiyasidan foydalaning. Indekslar equal va in so'rovlarini tezlashtiradi, lekin qo'shishni sekinlashtiradi — qidirish amalga oshirilmaydigan maydonlarni indekslamang. ObjectBox bir vaqtning o'zida bir nechta maydon bo'yicha filtrlash uchun murakkab indekslarni qo'llab-quvvatlaydi. Kombinatsiyalangan indekslar ro'yxatlardagi filtrlar uchun ayniqsa foydali: masalan, isCompleted va priority maydonlarida kombinatsiyalangan indeks bilan tugallanmagan yuqori prioritetli vazifalarni qidirish o'nlab marta tezroq amalga oshiriladi.
ObjectBox Sync — qurilmalar o'rtasida real vaqt rejimida ma'lumotlarni sinxronlashtirish uchun xususiy texnologiya. U last-writer-wins bilan konfliktlarni hal qilish bilan WebSocket asosidagi protokoldan foydalanadi. Sync oflayn sinxronizatsiyaga muhtoj ilovalar uchun mos keladi: eslatmalar, vazifalar ro'yxati, bir nechta sensorlardan IoT ma'lumotlari. Biroq, ishlab chiqarish uchun litsenziya sotib olish talab qilinadi.
// Bir nechta shartli so'rov
val highPriorityIncomplete = taskBox.query()
.greater(Task_.priority, 5)
.equal(Task_.isCompleted, false)
.build()
.find()
// Qator ostida qidirish
val searchResults = taskBox.query()
.contains(Task_.title, "mahsulot", StringOrder.CASE_INSENSITIVE)
.build()
.find()
Tez-tez beriladigan savollar
ObjectBox Apache 2.0 litsenziyasi ostida tarqatiladi, bu cheklovlarsiz tijorat foydalanishga ruxsat beradi. ObjectBox Sync (ko'p platformali sinxronizatsiya) xususiy funksiya bo'lib, ishlab chiqarish uchun litsenziya sotib olishni talab qiladi.
BoxStore thread-xavfsiz: bir nechta thread bir vaqtning o'zida ma'lumotlarni o'qiy oladi. Yozish Box darajasida bloklanadi. Murakkab tranzaksiyalar uchun operatsiyalar guruhining atomarligini kafolatlaydigan boxStore.runInTx() dan foydalaning.
Ha, ObjectBox 3.0 versiyasidan Kotlin Multiplatform (KMP) ni qo'llab-quvvatlaydi. Android, iOS, JVM va Native targetlari mavjud. KMP uchun expect/actual qo'llab-quvvatlashi bilan alohida Gradle plaginidan objectbox-kotlin foydalaniladi.
ObjectBox ma'lumotlarni ilova katalogidagi .mdb fayllarida saqlaydi. Zaxira nusxasi uchun ObjectBox katalogini BoxStore.copy() orqali yoki boxStore.close() chaqirilgandan keyin fayllarni qo'lda nusxalang. Jonli fayllarni nusxalash mumkin emas — bu ma'lumotlarni buzadi.
Room — SQLite ustidagi ORM, SQL so'rovlarini talab qiladi va ob'ektlarni xaritalash uchun yukga ega. ObjectBox SQL siz NoSQL dir, ancha tezroq, lekin murakkab JOIN larni qo'llab-quvvatlamaydi va relyatsion ma'lumotlar bazasi emas. Tanlov vazifaga bog'liq: relyatsion ma'lumotlar uchun — Room, tez ob'ekt saqlash uchun — ObjectBox.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.