ObjectBox هي قاعدة بيانات NoSQL عالية الأداء محسّنة للأجهزة المحمولة والحافة. على عكس SQLite، تستخدم تنسيق تخزين الملفات المسطحة الخاص بها بدون طبقة SQL. وفقاً لـ ObjectBox Benchmarks, 2024، يقوم ObjectBox بتنفيذ عمليات الإدراج والقراءة أسرع من 10 إلى 100 مرة من SQLite على أجهزة Android، مما يجعله الخيار الأفضل للتطبيقات المحمولة عالية التحميل.
الخلاصة
ObjectBox هي قاعدة بيانات NoSQL داخل الذاكرة تم تطويرها بواسطة الشركة الألمانية ObjectBox.io. على عكس قواعد البيانات العلائقية التقليدية، يخزن ObjectBox الكائنات مباشرة في ملفات مسطحة باستخدام تنسيقه الخاص SLOT (Super Lightweight Object Tree). هذا يلغي الحمل الزائد لـ ORM وتحليل SQL. تم تحسين تنسيق SLOT للأجهزة ذات الذاكرة المحدودة: يتم إلغاء تجزئة البيانات تلقائياً، وحجم قاعدة البيانات أصغر في المتوسط من 4 إلى 6 مرات من قاعدة بيانات SQLite المكافئة بنفس عدد السجلات.
يدعم ObjectBox جميع المنصات المحمولة الرئيسية: Android و iOS و Flutter. لنظام Android، إنشاء الكود متاح عبر ObjectBox Gradle Plugin، الذي يعالج الكيانات المشروحة وينشئ فئات Box للعمل مع البيانات. بالنسبة لـ Flutter، يتم استخدام إضافة أصلية مع غلاف Dart. بالإضافة إلى المنصات المحمولة، يعمل ObjectBox على Linux و macOS و Windows و WebAssembly، مما يسمح بإعادة استخدام نموذج البيانات بين التطبيق المحمول ومزامنة الخادم.
وفقاً لدراسة ObjectBox (2023)، يتم استخدام قاعدة البيانات في أكثر من 5000 تطبيق على Google Play، بما في ذلك التطبيقات التي تضم أكثر من 10 ملايين مستخدم. حالات الاستخدام الرئيسية: التخزين المؤقت للبيانات، العمل دون اتصال، وتخزين السلاسل الزمنية (IoT). يحظى ObjectBox بشعبية خاصة في تطبيقات تتبع الصحة واللياقة البدنية التي تتطلب تسجيلاً سريعاً لقراءات أجهزة الاستشعار على الجهاز بدون اتصال دائم بالإنترنت ولجمع التحليلات من أجهزة متعددة.
ObjectBox ظهر كبديل لـ Realm و SQLite لمنصة Android. صدرت النسخة المستقرة الأولى في عام 2018. الفرق الرئيسي عن Realm هو أن ObjectBox ليس لديه قيود GPL (يستخدم Apache 2.0) ويدعم منصات أكثر: من الأجهزة المحمولة إلى خوادم Linux.
ObjectBox يوفر: إنشاء تلقائي لفئات Box، فهارس مدمجة للبحث السريع، معاملات مع دعم التراجع، استعلامات تفاعلية عبر RxJava و Kotlin Flow، ومزامنة بين الأجهزة عبر ObjectBox Sync (بروتوكول مملوك). على عكس Firebase Realtime Database، يعمل ObjectBox Sync بنموذج نظير لنظير بدون خادم مركزي، مما يقلل من زمن الوصول وتكاليف البنية التحتية.
ObjectBox يخزن البيانات في تنسيقه الثنائي الخاص .mdb (ObjectBox Data File). يتم تعيين كل كيان لملف واحد، حيث يتم تخزين السجلات بالتسلسل مع إزاحة ثابتة. هذا يسمح بقراءة وكتابة الكائنات الفردية بدون فحص كامل للملف.
العمل مع ObjectBox لا يتطلب SQL: يتم بناء الاستعلامات عبر واجهة برمجة تطبيقات fluent في الكود. يقوم المترجم بإنشاء فئات مساعدة MyObjectBox و Boxes التي تغلف جميع عمليات CRUD. يتم وصف نموذج البيانات باستخدام التعليقات التوضيحية @Entity و @Id و @Index و @Relation.
// Connecting ObjectBox in Android
class App: Application() {
lateinit var boxStore: BoxStore
override fun onCreate() {
super.onCreate()
boxStore = MyObjectBox.builder()
.androidContext(this)
.build()
}
}
وفقاً لاختبارات الأداء الرسمية، يتفوق ObjectBox بشكل كبير على SQLite في السرعة، خاصة في الإدراج الجماعي والقراءات الجماعية. ومع ذلك، يظل SQLite هو المعيار الفعلي للتطبيقات المحمولة بسبب انتشاره ودعم SQL المدمج.
| العملية | ObjectBox | SQLite | الفرق |
|---|---|---|---|
| إدراج (1000 سجل) | ~5 مللي ثانية | ~180 مللي ثانية | أسرع ×36 |
| قراءة (1000 سجل) | ~3 مللي ثانية | ~70 مللي ثانية | أسرع ×23 |
| تحديث (1000 سجل) | ~6 مللي ثانية | ~150 مللي ثانية | أسرع ×25 |
| بحث بالفهرس | ~0.1 مللي ثانية | ~2 مللي ثانية | أسرع ×20 |
| حجم قاعدة البيانات (1000 كائن) | ~28 كيلوبايت | ~112 كيلوبايت | أصغر 4 مرات |
ObjectBox يخسر أمام SQLite في السيناريوهات التي تتطلب استعلامات JOIN معقدة، دوال تجميعية (SUM، COUNT مع تجميع)، أو تكامل مع مخطط SQL موجود. إذا كان المشروع يستخدم بالفعل SQLite مع Room ORM، فإن الترحيل إلى ObjectBox سيتطلب إعادة كتابة كل منطق الوصول إلى البيانات. ObjectBox أيضاً لا يدعم استعلامات SQL المخصصة — فقط واجهة برمجة تطبيقات fluent. ومع ذلك، لعمليات CRUD النموذجية والتخزين المؤقت، يوفر ObjectBox تحسناً في الأداء يصل إلى 100 مرة، كما تؤكد ذلك الاختبارات الرسمية على أجهزة Android بإصدارات مختلفة من نظام التشغيل.
ObjectBox يستخدم التعليقات التوضيحية لتعريف الكيانات. بعد التجميع، يتم إنشاء فئات Box بطرق put و get و remove و query. فيما يلي العمليات النموذجية لنموذج Task في تطبيق قائمة المهام.
يتم توضيح كل كيان بـ @Entity. الحقل الذي يحتوي على @Id يصبح المفتاح الأساسي، و @Index يسرع البحث في هذا الحقل. يدعم ObjectBox إنشاء المعرفات تلقائياً عندما تكون القيمة 0.
@Entity
data class Task(
@Id var id: Long = 0,
@Index var title: String = "",
var isCompleted: Boolean = false,
var priority: Int = 0
)
Box هي الفئة الرئيسية للعمل مع الكيانات. طريقة put() تحفظ أو تحدث كائناً، get() تقرأ بواسطة المعرف، و remove() تحذف. جميع العمليات الأساسية متزامنة ويتم تنفيذها في سلسلة الاستدعاء.
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)
ObjectBox يدعم الاستعلامات التفاعلية عبر .subscribe(). يتلقى المشترك إشعارات عندما تتغير البيانات المطابقة لشرط الاستعلام. هذا مناسب لواجهة المستخدم التي تقوم بتحديث القائمة تلقائياً عند إضافة أو إزالة العناصر.
val query = taskBox.query()
.equal(Task_.isCompleted, false)
.orderDesc(Task_.priority)
.build()
query.subscribe { tasks ->
// tasks — List, يتحدث تلقائيًا
updateUi(tasks)
}
ObjectBox يدعم العلاقات بين الكيانات — واحد لواحد، واحد لكثير، وكثير لكثير. يتم تعريف العلاقات عبر التعليق التوضيحي @Relation. على عكس SQLite، لا يستخدم ObjectBox المفاتيح الخارجية: يتم تنفيذ العلاقات من خلال قوائم المعرفات في ملفات مسطحة، مما يسرع التنقل في الرسم البياني للكائنات.
علاقة @Backlink تسمح بالتنقل من كيان فرعي إلى الكيان الأب دون حقل مرجعي منفصل. يحافظ ObjectBox تلقائياً على الرابط العكسي، مما يلغي ازدواجية البيانات والمزامنة بين جدولين.
ObjectBox Query Builder يتيح بناء سلاسل من الشروط: equal، notEqual، greater، less، in، contains، startsWith. يمكن دمج جميع الشروط عبر and/or. يمكن فرز النتيجة وتحديدها والحصول عليها كـ List أو LazyList (لمجموعات البيانات الكبيرة).
ObjectBox يقوم بفهرسة حقل @Id تلقائياً. للفهارس المخصصة، استخدم التعليق التوضيحي @Index على الحقول التي يتم الاستعلام عنها بشكل متكرر. الفهارس تسرع استعلامات equal و in ولكنها تبطئ الإدراج — لا تقم بفهرسة الحقول التي لا يتم البحث عنها. يدعم ObjectBox الفهارس المركبة للتصفية بعدة حقول في وقت واحد. الفهارس المركبة مفيدة بشكل خاص لمرشحات القوائم: على سبيل المثال، البحث عن المهام غير المكتملة ذات الأولوية العالية يكون أسرع بعشرات المرات باستخدام فهرس مركب على حقلي isCompleted و priority.
ObjectBox Sync هي تقنية مملوكة لمزامنة البيانات في الوقت الفعلي بين الأجهزة. تستخدم بروتوكولاً قائماً على WebSocket مع حل النزاعات بواسطة آخر كاتب. Sync مناسب للتطبيقات التي تحتاج إلى مزامنة دون اتصال: الملاحظات، قوائم المهام، بيانات IoT من أجهزة استشعار متعددة. ومع ذلك، يلزم شراء ترخيص للإنتاج.
// 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()
الأسئلة الشائعة
ObjectBox يتم توزيعه بموجب ترخيص Apache 2.0، الذي يسمح بالاستخدام التجاري بدون قيود. ميزة ObjectBox Sync (المزامنة عبر المنصات) مملوكة وتتطلب شراء ترخيص للإنتاج.
BoxStore آمن للخيوط: يمكن لعدة خيوط قراءة البيانات في وقت واحد. يتم قفل الكتابة على مستوى Box. للمعاملات المعقدة، استخدم boxStore.runInTx() الذي يضمن ذرية مجموعة من العمليات.
نعم، ObjectBox يدعم Kotlin Multiplatform (KMP) بدءاً من الإصدار 3.0. الأهداف المتاحة هي Android و iOS و JVM و Native. بالنسبة لـ KMP، يتم استخدام إضافة Gradle منفصلة objectbox-kotlin مع دعم expect/actual.
ObjectBox يخزن البيانات في ملفات .mdb في دليل التطبيق. للنسخ الاحتياطي، انسخ دليل ObjectBox بالكامل عبر BoxStore.copy() أو انسخ الملفات يدوياً بعد استدعاء boxStore.close(). لا يمكن نسخ الملفات الحية — فهذا سيتلف البيانات.
Room هو ORM فوق SQLite، يتطلب استعلامات SQL وله حمل زائد لتعيين الكائنات. ObjectBox هي قاعدة بيانات NoSQL بدون SQL، أسرع بمرتبة من حيث الحجم، ولكنها لا تدعم JOIN المعقدة وليست قاعدة بيانات علائقية. يعتمد الاختيار على المهمة: للبيانات العلائقية — Room، للتخزين السريع للكائنات — ObjectBox.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.