ObjectBox एक उच्च-प्रदर्शन NoSQL डेटाबेस है जो मोबाइल और एज उपकरणों के लिए अनुकूलित है। SQLite के विपरीत, यह SQL परत के बिना अपने स्वयं के फ्लैट-फ़ाइल संग्रहण प्रारूप का उपयोग करता है। ObjectBox Benchmarks, 2024 के अनुसार, ObjectBox Android उपकरणों पर SQLite की तुलना में 10–100 गुना तेज़ी से इन्सर्ट और रीड ऑपरेशन करता है, जो इसे उच्च-लोड मोबाइल एप्लिकेशन के लिए सबसे अच्छा विकल्प बनाता है।
मुख्य बिंदु
ObjectBox एक इन-मेमोरी NoSQL डेटाबेस है जिसे जर्मन कंपनी ObjectBox.io द्वारा विकसित किया गया है। पारंपरिक रिलेशनल डेटाबेस के विपरीत, ObjectBox अपने स्वयं के SLOT (Super Lightweight Object Tree) प्रारूप का उपयोग करके ऑब्जेक्ट को सीधे फ्लैट फ़ाइलों में संग्रहीत करता है। यह ORM और SQL पार्सिंग के ओवरहेड को समाप्त करता है। SLOT प्रारूप सीमित मेमोरी वाले उपकरणों के लिए अनुकूलित है: डेटा स्वचालित रूप से डीफ़्रैग्मेंट होता है, और डेटाबेस का आकार समान संख्या में रिकॉर्ड वाले समतुल्य SQLite डेटाबेस से औसतन 4–6 गुना छोटा होता है।
ObjectBox सभी प्रमुख मोबाइल प्लेटफ़ॉर्म का समर्थन करता है: Android, iOS और Flutter। Android के लिए, ObjectBox Gradle Plugin के माध्यम से कोड जनरेशन उपलब्ध है, जो एनोटेटेड एंटिटी को प्रोसेस करता है और डेटा के साथ काम करने के लिए Box क्लास बनाता है। Flutter के लिए, Dart रैपर के साथ एक नेटिव प्लगइन का उपयोग किया जाता है। मोबाइल प्लेटफ़ॉर्म के अलावा, ObjectBox Linux, macOS, Windows और WebAssembly पर चलता है, जिससे मोबाइल ऐप और सर्वर सिंक्रोनाइज़ेशन के बीच डेटा मॉडल का पुन: उपयोग किया जा सकता है।
ObjectBox अध्ययन (2023) के अनुसार, डेटाबेस का उपयोग Google Play पर 5,000 से अधिक एप्लिकेशन में किया जाता है, जिसमें 10 मिलियन से अधिक उपयोगकर्ताओं वाले ऐप शामिल हैं। मुख्य उपयोग मामले: डेटा कैशिंग, ऑफ़लाइन संचालन और टाइम-सीरीज़ स्टोरेज (IoT)। ObjectBox विशेष रूप से स्वास्थ्य और फिटनेस ट्रैकिंग ऐप में लोकप्रिय है, जिन्हें निरंतर इंटरनेट कनेक्शन के बिना डिवाइस पर सेंसर रीडिंग की तेज़ रिकॉर्डिंग और कई उपकरणों से एनालिटिक्स एकत्र करने की आवश्यकता होती है।
ObjectBox Android प्लेटफ़ॉर्म के लिए Realm और SQLite के विकल्प के रूप में उभरा। पहला स्थिर संस्करण 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 API के माध्यम से बनाई जाती हैं। कंपाइलर सहायक क्लास 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 तेज़ |
| DB आकार (1000 ऑब्जेक्ट) | ~28 KB | ~112 KB | 4 गुना छोटा |
ObjectBox उन परिदृश्यों में SQLite से पीछे रह जाता है जहाँ जटिल JOIN क्वेरी, एग्रीगेट फ़ंक्शन (SUM, COUNT ग्रुपिंग के साथ), या मौजूदा SQL स्कीमा के साथ एकीकरण की आवश्यकता होती है। यदि प्रोजेक्ट पहले से ही SQLite को Room ORM के साथ उपयोग करता है, तो ObjectBox में माइग्रेट करने के लिए सभी डेटा एक्सेस लॉजिक को फिर से लिखना होगा। ObjectBox कस्टम SQL क्वेरी का भी समर्थन नहीं करता — केवल fluent API। हालाँकि, सामान्य CRUD संचालन और कैशिंग के लिए, ObjectBox 100 गुना तक प्रदर्शन सुधार प्रदान करता है, जैसा कि विभिन्न OS संस्करणों वाले Android उपकरणों पर आधिकारिक बेंचमार्क द्वारा पुष्टि की गई है।
ObjectBox एंटिटी को परिभाषित करने के लिए एनोटेशन का उपयोग करता है। संकलन के बाद, put, get, remove और query विधियों वाली Box क्लास बनाई जाती हैं। नीचे टू-डू लिस्ट ऐप में Task मॉडल के लिए सामान्य संचालन दिए गए हैं।
प्रत्येक एंटिटी को @Entity से एनोटेट किया जाता है। @Id वाला फ़ील्ड प्राथमिक कुंजी बन जाता है, और @Index उस फ़ील्ड पर खोज को गति देता है। ObjectBox मान 0 होने पर स्वचालित ID जनरेशन का समर्थन करता है।
@Entity
data class Task(
@Id var id: Long = 0,
@Index var title: String = "",
var isCompleted: Boolean = false,
var priority: Int = 0
)
Box एंटिटी के साथ काम करने के लिए मुख्य क्लास है। put() विधि किसी ऑब्जेक्ट को सहेजती या अपडेट करती है, get() ID द्वारा पढ़ती है, और 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() के माध्यम से रिएक्टिव क्वेरी का समर्थन करता है। सब्सक्राइबर को तब सूचनाएँ मिलती हैं जब क्वेरी की शर्त से मेल खाने वाला डेटा बदलता है। यह UI के लिए सुविधाजनक है, जो आइटम जोड़े या हटाए जाने पर सूची को स्वचालित रूप से अपडेट करता है।
val query = taskBox.query()
.equal(Task_.isCompleted, false)
.orderDesc(Task_.priority)
.build()
query.subscribe { tasks ->
// tasks — List, स्वचालित रूप से अपडेट होता है
updateUi(tasks)
}
ObjectBox एंटिटी के बीच संबंधों का समर्थन करता है — To-One, To-Many और Many-to-Many। संबंध @Relation एनोटेशन के माध्यम से परिभाषित किए जाते हैं। SQLite के विपरीत, ObjectBox विदेशी कुंजियों का उपयोग नहीं करता: संबंध फ्लैट फ़ाइलों में ID सूचियों के माध्यम से कार्यान्वित किए जाते हैं, जो ऑब्जेक्ट के ग्राफ नेविगेशन को गति देता है।
@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 संस्करण 3.0 से Kotlin Multiplatform (KMP) का समर्थन करता है। Android, iOS, JVM और Native लक्ष्य उपलब्ध हैं। KMP के लिए, expect/actual समर्थन के साथ एक अलग Gradle प्लगइन objectbox-kotlin का उपयोग किया जाता है।
ObjectBox ऐप निर्देशिका में .mdb फ़ाइलों में डेटा संग्रहीत करता है। बैकअप के लिए, BoxStore.copy() के माध्यम से पूरी ObjectBox निर्देशिका को कॉपी करें या boxStore.close() को कॉल करने के बाद मैन्युअल रूप से फ़ाइलों को कॉपी करें। लाइव फ़ाइलों को कॉपी नहीं किया जा सकता — इससे डेटा दूषित हो जाएगा।
Room SQLite के ऊपर एक ORM है, जिसके लिए SQL क्वेरी की आवश्यकता होती है और इसमें ऑब्जेक्ट मैपिंग का ओवरहेड होता है। ObjectBox बिना SQL के एक NoSQL डेटाबेस है, जो परिमाण के क्रम में तेज़ है, लेकिन जटिल JOIN का समर्थन नहीं करता और रिलेशनल डेटाबेस नहीं है। चुनाव कार्य पर निर्भर करता है: रिलेशनल डेटा के लिए — Room, तेज़ ऑब्जेक्ट स्टोरेज के लिए — ObjectBox।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें