ObjectBox — mobil və edge cihazları üçün optimallaşdırılmış yüksək məhsuldar NoSQL verilənlər bazasıdır. SQLite-dən fərqli olaraq, SQL təbəqəsi olmayan düz fayllar əsasında öz saxlama formatından istifadə edir. ObjectBox Benchmarks, 2024 məlumatlarına görə, ObjectBox Android cihazlarında daxiletmə və oxuma əməliyyatlarını SQLite-dən 10–100 dəfə daha sürətli yerinə yetirir ki, bu da onu yüksək yüklü mobil tətbiqlər üçün ən yaxşı seçim edir.
Əsas qeydlər
ObjectBox — Almaniyanın ObjectBox.io şirkəti tərəfindən hazırlanmış in-memory NoSQL verilənlər bazasıdır. Ənənəvi relational verilənlər bazalarından fərqli olaraq, ObjectBox obyektləri birbaşa düz fayllarda, öz SLOT (Super Lightweight Object Tree) formatından istifadə edərək saxlayır. Bu, ORM və SQL parserinin yükünü aradan qaldırır. SLOT formatı məhdud yaddaşa malik cihazlarda işləmək üçün optimallaşdırılıb: məlumatlar avtomatik defraqmentasiya olunur və VB ölçüsü eyni sayda qeydlərdə ekvivalent SQLite bazasından orta hesabla 4–6 dəfə kiçikdir.
ObjectBox bütün əsas mobil platformaları dəstəkləyir: Android, iOS və Flutter. Android üçün kod generasiyası ObjectBox Gradle Plugin vasitəsilə mövcuddur ki, bu da anotasiya edilmiş varlıqları emal edir və verilənlərlə iş üçün Box sinifləri yaradır. Flutter üçün Dart qabığı ilə native plagin istifadə olunur. Mobil platformalardan əlavə, ObjectBox Linux, macOS, Windows və WebAssembly-də işləyir ki, bu da məlumat modelinin mobil tətbiq və server sinxronizasiyası arasında təkrar istifadəsinə imkan verir.
ObjectBox (2023) tədqiqat məlumatlarına görə, verilənlər bazası Google Play-də 5000-dən çox tətbiqdə, o cümlədən 10 milyondan çox istifadəçisi olan tətbiqlərdə istifadə olunur. Əsas ssenarilər: məlumatların keşləşdirilməsi, oflayn rejimdə iş və zaman seriyalarının saxlanması (IoT). ObjectBox xüsusilə sağlamlıq izləmə və fitnes tətbiqlərində populyardır, burada sensor göstəricilərinin daimi internet bağlantısı olmadan cihazda sürətli yazılması və bir neçə cihazdan analitika toplanması tələb olunur.
ObjectBox Android platforması üçün Realm və SQLite-ə alternativ olaraq ortaya çıxdı. İlk stabil versiya 2018-ci ildə buraxıldı. Realm-dən əsas fərq — ObjectBox-də GPL məhdudiyyətləri yoxdur (Apache 2.0 istifadə olunur) və daha çox platformanı dəstəkləyir: mobil cihazlardan Linux serverlərinə qədər.
ObjectBox təmin edir: Box siniflərinin avtomatik generasiyası, sürətli axtarış üçün daxili indekslər, geri qaytarma dəstəyi ilə tranzaksiyalar, RxJava və Kotlin Flow vasitəsilə reaktiv sorğular, həmçinin ObjectBox Sync (mülkiyyət protokolu) vasitəsilə cihazlar arasında sinxronizasiya. Firebase Realtime Database-dən fərqli olaraq, ObjectBox Sync mərkəzi server olmadan peer-to-peer modelində işləyir ki, bu da gecikmələri və infrastruktur xərclərini azaldır.
ObjectBox məlumatları öz ikili .mdb (ObjectBox Data File) formatında saxlayır. Hər bir varlıq (Entity) bir fayla xəritələnir, burada qeydlər sabit yerdəyişmə ilə ardıcıl saxlanılır. Bu, faylı tam skan etmədən ayrı-ayrı obyektləri oxumaq və yazmaq imkanı verir.
ObjectBox ilə işləmək üçün SQL lazım deyil: sorğular koddakı fluent-API vasitəsilə qurulur. Kompilyator bütün CRUD əməliyyatlarını kapsulalayan köməkçi siniflər MyObjectBox və qutular (Box) yaradır. Məlumat modeli anotasiyalar @Entity, @Id, @Index və @Relation vasitəsilə təsvir olunur.
// ObjectBox-u Android-də qoşma
class App: Application() {
lateinit var boxStore: BoxStore
override fun onCreate() {
super.onCreate()
boxStore = MyObjectBox.builder()
.androidContext(this)
.build()
}
}
Rəsmi etalonlara görə, ObjectBox əməliyyat sürətinə görə SQLite-dən əhəmiyyətli dərəcədə üstündür, xüsusilə toplu daxiletmə və kütləvi oxumada. Bununla belə, SQLite geniş yayılması və daxili SQL dəstəyi sayəsində mobil tətbiqlər üçün de-fakto standart olaraq qalır.
| Əməliyyat | ObjectBox | SQLite | Fərq |
|---|---|---|---|
| Daxiletmə (1000 qeyd) | ~5 ms | ~180 ms | x36 sürətli |
| Oxuma (1000 qeyd) | ~3 ms | ~70 ms | x23 sürətli |
| Yeniləmə (1000 qeyd) | ~6 ms | ~150 ms | x25 sürətli |
| İndeks üzrə axtarış | ~0.1 ms | ~2 ms | x20 sürətli |
| VB ölçüsü (1000 obyekt) | ~28 KB | ~112 KB | 4 dəfə kiçik |
ObjectBox mürəkkəb JOIN sorğuları, aqreqat funksiyalar (SUM, COUNT qruplaşdırma ilə) və ya mövcud SQL sxemi ilə inteqrasiya tələb olunan ssenarilərdə SQLite-dən geri qalır. Layihə artıq SQLite-dən Room ORM ilə istifadə edirsə — ObjectBox-a miqrasiya bütün məlumat giriş məntiqinin yenidən yazılmasını tələb edəcək. ObjectBox həmçinin fərdi SQL sorğularını dəstəkləmir — yalnız fluent-API. Bununla belə, tipik CRUD əməliyyatları və keşləşdirmə üçün ObjectBox 100 dəfəyə qədər performans artımı verir ki, bu da müxtəlif OS versiyaları olan Android cihazlarında rəsmi etalonlarla təsdiqlənir.
ObjectBox varlıqları təyin etmək üçün anotasiyalardan istifadə edir. Kompilyasiyadan sonra put, get, remove və query metodları ilə Box sinifləri yaradılır. Aşağıda tapşırıq siyahısı tətbiqində Task modeli üçün tipik əməliyyatlar göstərilib.
Hər bir varlıq @Entity ilə anotasiya olunur. @Id olan sahə əsas açar olur, @Index sahə üzrə axtarışı sürətləndirir. ObjectBox 0 dəyərində ID-nin avtomatik generasiyasını dəstəkləyir.
@Entity
data class Task(
@Id var id: Long = 0,
@Index var title: String = "",
var isCompleted: Boolean = false,
var priority: Int = 0
)
Box — varlıqlarla iş üçün əsas sinif. put() metodu obyekti saxlayır və ya yeniləyir, get() ID ilə oxuyur, remove() silir. Bütün əsas əməliyyatlar sinxrondur və çağıran thread-də yerinə yetirilir.
val taskBox: Box<Task> = boxStore.boxFor(Task::class.java)
// Yaratma
val task = Task(title = "Məhsulları al", priority = 3)
val newId = taskBox.put(task)
// Oxuma
val savedTask = taskBox.get(newId)
// Yeniləmə
savedTask.isCompleted = true
taskBox.put(savedTask)
// Sil
taskBox.remove(newId)
ObjectBox .subscribe() vasitəsilə reaktiv sorğuları dəstəkləyir. Abunəçi sorğu şərtinə uyğun gələn məlumatlarda hər hansı dəyişiklik olduqda bildiriş alır. Bu, elementlər əlavə edildikdə və ya silindikdə siyahını avtomatik yeniləyən UI üçün əlverişlidir.
val query = taskBox.query()
.equal(Task_.isCompleted, false)
.orderDesc(Task_.priority)
.build()
query.subscribe { tasks ->
// tasks — List, avtomatik yenilənir
updateUi(tasks)
}
ObjectBox varlıqlar arasında əlaqələri dəstəkləyir — To-One, To-Many və Many-to-Many. Əlaqələr @Relation anotasiyası vasitəsilə təyin olunur. SQLite-dən fərqli olaraq, ObjectBox xarici açarlardan istifadə etmir: əlaqələr düz fayllardakı ID siyahıları vasitəsilə həyata keçirilir ki, bu da obyekt qrafiki üzrə naviqasiyanı sürətləndirir.
@Backlink əlaqəsi ayrıca istinad sahəsi olmadan uşaq varlıqdan valideynə keçməyə imkan verir. ObjectBox avtomatik olaraq əks istinadı saxlayır ki, bu da məlumatların təkrarlanmasını və iki cədvəl arasında sinxronizasiyanı aradan qaldırır.
ObjectBox Query Builder şərtlər zənciri qurmağa imkan verir: equal, notEqual, greater, less, in, contains, startsWith. Bütün şərtlər and/or vasitəsilə birləşdirilir. Nəticə sıralana, məhdudlaşdırıla və List və ya LazyList (böyük məlumat dəstləri üçün) kimi alına bilər.
ObjectBox @Id sahəsini avtomatik indeksləşdirir. Fərdi indekslər üçün tez-tez sorğulanan sahələrdə @Index anotasiyasından istifadə edin. İndekslər equal və in sorğularını sürətləndirir, lakin daxiletməni yavaşladır — axtarış aparılmayan sahələri indeksləşdirməyin. ObjectBox eyni anda bir neçə sahə üzrə filtrləmə üçün mürəkkəb indeksləri dəstəkləyir. Mürəkkəb indekslər siyahılardakı filtrlər üçün xüsusilə faydalıdır: məsələn, isCompleted və priority sahələrində mürəkkəb indekslə tamamlanmamış yüksək prioritetli tapşırıqların axtarışı onlarla dəfə sürətli olur.
ObjectBox Sync — cihazlar arasında real vaxt rejimində məlumat sinxronizasiyası üçün mülkiyyət texnologiyasıdır. O, last-writer-wins ilə konflikt həlli ilə WebSocket əsaslı protokoldan istifadə edir. Sync oflayn sinxronizasiyaya ehtiyacı olan tətbiqlər üçün uyğundur: qeydlər, tapşırıq siyahıları, bir neçə sensordan IoT məlumatları. Bununla belə, istehsal üçün lisenziya alınması tələb olunur.
// Çox şərtli sorğu
val highPriorityIncomplete = taskBox.query()
.greater(Task_.priority, 5)
.equal(Task_.isCompleted, false)
.build()
.find()
// Alt sətir üzrə axtarış
val searchResults = taskBox.query()
.contains(Task_.title, "məhsul", StringOrder.CASE_INSENSITIVE)
.build()
.find()
Tez-tez verilən suallar
ObjectBox Apache 2.0 lisenziyası altında yayılır ki, bu da məhdudiyyətsiz kommersiya istifadəsinə icazə verir. ObjectBox Sync (çapraz-platforma sinxronizasiyası) mülkiyyət funksiyasıdır və istehsal üçün lisenziya alınması tələb olunur.
BoxStore thread-təhlükəsizdir: bir neçə thread eyni anda məlumatları oxuya bilər. Yazma Box səviyyəsində bloklanır. Mürəkkəb tranzaksiyalar üçün əməliyyatlar qrupunun atomarlığını təmin edən boxStore.runInTx() istifadə edin.
Bəli, ObjectBox 3.0 versiyasından Kotlin Multiplatform (KMP) dəstəkləyir. Android, iOS, JVM və Native hədəfləri mövcuddur. KMP üçün expect/actual dəstəyi ilə ayrıca Gradle plaginindən objectbox-kotlin istifadə olunur.
ObjectBox məlumatları tətbiq kataloqunda .mdb fayllarında saxlayır. Ehtiyat nüsxə üçün ObjectBox kataloqunu BoxStore.copy() vasitəsilə və ya boxStore.close() çağırışından sonra faylları əl ilə kopyalayın. Canlı faylları kopyalamaq olmaz — bu məlumatları zədələyər.
Room — SQLite üzərində ORM, SQL sorğuları tələb edir və obyektlərin xəritələnməsinə yük gətirir. ObjectBox SQL-siz NoSQL-dir, daha sürətlidir, lakin mürəkkəb JOIN-ləri dəstəkləmir və relational verilənlər bazası deyil. Seçim tapşırıqdan asılıdır: relational məlumatlar üçün — Room, sürətli obyekt saxlanması üçün — ObjectBox.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun