לעתים קרובות אנו נתקלים במצב: אפליקציית אנדרואיד מגמגמת בעת ביצוע הכנסות נתונים בכמות גדולה — כתיבת 1000 אובייקטים דרך Room אורכת 15 שניות. הלקוח מאבד משתמשים עקב הפיגור. ObjectBox פותר זאת: יישום C++ מקורי ללא ניתוח SQL מספק האצה של עד פי 10 בפעולות כתיבה. בניסיון שלנו, שילבנו את ObjectBox במעקב IoT ששמר 500 נקודות כל 5 דקות — זמן הכתיבה ירד מ-8 ל-0.7 שניות. חיסכון בזמן פיתוח: עד שבועיים לפרויקט בזכות יצירת קוד אוטומטית וללא DAOs. בנוסף, מודל האובייקטים מפחית את נפח הקוד ב-30–40%, מה שמוריד ישירות את עלויות הפיתוח והתחזוקה.
אנו מגדירים את ObjectBox מקצה לקצה, כולל מודלים, שאילתות ריאקטיביות וסנכרון. אנו מעריכים את הפרויקט שלך ביום אחד — צור קשר כדי להתחיל.
למה ObjectBox מהיר יותר מ-SQLite?
ObjectBox הוא מסד נתונים אובייקטי, לא relational. אין JOINs, אין GROUP BY — אבל לעבודה עם גרפי אובייקטים (ישויות עם קשרים) זה לא נחוץ. בדיקות ביצועים מ-ObjectBox מראות יתרון של פי 10 על פני Room/SQLite בכתיבה. בפרויקטים אמיתיים, הפער תלוי בדפוסים: הכנסות בכמות גדולה — רווח של פי 3–10, קריאות לפי ID — שווה בערך. עבור אפליקציות IoT, מעקבים, שמירות משחק, קטלוגים עם סינון, ObjectBox הוא אידיאלי. חיסכון בפיתוח: עד 40% בהשוואה לפתרונות מסורתיים.
איך להגדיר את ObjectBox ב-3–5 ימים?
תהליך ההגדרה כולל מספר שלבים:
- ניתוח סכמת נתונים: זיהוי ישויות וקשרים.
- עיצוב ישויות עם קשרים (ToOne, ToMany).
- שילוב BoxStore במחלקת Application.
- יישום שאילתות ריאקטיביות דרך DataObserver.
- בדיקות ביצועים: מדידת מהירות כתיבה/קריאה.
- פריסה לחנות האפליקציות.
להלן מחסנית טיפוסית וקוד.
חיבור ומודלים
// build.gradle (app)
plugins {
id("io.objectbox")
}
dependencies {
implementation("io.objectbox:objectbox-kotlin:3.8.0")
} @Entity
data class Task(
@Id var id: Long = 0,
var title: String = "",
var description: String = "",
var priority: Int = 0,
var dueDate: Long = 0,
var isCompleted: Boolean = false
) {
val tags: ToMany<Tag> = toMany()
}
@Entity
data class Tag(
@Id var id: Long = 0,
var name: String = "",
@Index var color: String = ""
)// build.gradle (app) plugins { id("io.objectbox") } dependencies { implementation("io.objectbox:objectbox-kotlin:3.8.0") } הוא Long חובה עבור מזהה ObjectBox פנימי. זה לא UUID או מזהה עסקי שלך — השתמש בשדה מחרוזת נפרד לסנכרון שרת.
אתחול ו-BoxStore
// Application класс
class MyApp : Application() {
companion object {
lateinit var boxStore: BoxStore
private set
}
override fun onCreate() {
super.onCreate()
boxStore = MyObjectBox.builder()
.androidContext(this)
.name("tasks-db")
.build()
}
}
// Использование в ViewModel
class TaskViewModel : ViewModel() {
private val taskBox: Box<Task> = MyApp.boxStore.boxFor(Task::class.java)
val tasks: LiveData<List<Task>> = liveData(Dispatchers.IO) {
val query = taskBox.query(Task_.isCompleted.equal(false))
.order(Task_.priority, QueryBuilder.DESCENDING)
.build()
emitSource(query.subscribe().toLiveData())
}
}@Entity data class Task( @Id var id: Long = 0, var title: String = "", var description: String = "", var priority: Int = 0, var dueDate: Long = 0, var isCompleted: Boolean = false ) { val tags: ToMany<Tag> = toMany() } @Entity data class Tag( @Id var id: Long = 0, var name: String = "", @Index var color: String = "" ) — ObjectBox DataObserver מודיע אוטומטית כאשר הנתונים בתיבה משתנים. זהו מנוי ריאקטיבי ללא קוד נוסף.
שאילתות דרך QueryBuilder
ObjectBox אינו משתמש ב-SQL מחרוזתי. שאילתות דרך @Id בטיחותי מבחינת טיפוסים עם // Application класс class MyApp : Application() { companion object { lateinit var boxStore: BoxStore private set } override fun onCreate() { super.onCreate() boxStore = MyObjectBox.builder() .androidContext(this) .name("tasks-db") .build() } } // Использование в ViewModel class TaskViewModel : ViewModel() { private val taskBox: Box<Task> = MyApp.boxStore.boxFor(Task::class.java) val tasks: LiveData<List<Task>> = liveData(Dispatchers.IO) { val query = taskBox.query(Task_.isCompleted.equal(false)) .order(Task_.priority, QueryBuilder.DESCENDING) .build() emitSource(query.subscribe().toLiveData()) } } — מטא-מחלקות שנוצרו (query.subscribe().toLiveData(), QueryBuilder):
// Фильтрация с несколькими условиями
val urgentTasks = taskBox.query(
Task_.isCompleted.equal(false)
.and(Task_.priority.greater(2))
.and(Task_.dueDate.less(System.currentTimeMillis() + 86_400_000L))
)
.order(Task_.dueDate)
.build()
.find()
// Полнотекстовый поиск — требует @Index(type = IndexType.VALUE) + FTS
val searchResults = taskBox.query(
Task_.title.contains("meeting", StringOrder.CASE_INSENSITIVE)
)
.build()
.find()
אין JOINs — קשרים דרך Properties/Task_. ObjectBox טוען אובייקטים קשורים באופן עצלן כברירת מחדל:
// ToMany загружается при первом обращении val taskTags = task.tags // lazy load, обращение к DB ObjectBox Sync
שים לב: כמו Realm, ObjectBox מציע שרת סנכרון מסחרי — ObjectBox Sync. סנכרון דו-כיווני, פתרון קונפליקטים, עדכוני דלתא. זהו מוצר נפרד עם מודל רישוי. אנו משלבים את Sync באפליקציה שלך במפתח פתוח.
איך עובד ObjectBox Sync?
ObjectBox Sync משתמש בסנכרון דלתא: רק אובייקטים ששונו מועברים, לא כל מסד הנתונים. פתרון קונפליקטים ניתן להגדרה: ניתן לבחור "הכותב האחרון מנצח", "עדיפות מקומית", או לוגיקה מותאמת אישית. כדי להתחיל, פשוט הגדר שרת Sync וציין את ה-URL בלקוח.
השוואה בין ObjectBox ו-Room
| קריטריון | ObjectBox | Room/SQLite |
|---|---|---|
| מהירות כתיבה (1000 אובייקטים) | ~0.5 שניות | ~5–15 שניות |
| מהירות קריאה לפי ID | ~0.1 אלפיות השנייה | ~0.2 אלפיות השנייה |
| שאילתות ריאקטיביות | DataObserver | Flow/LiveData דרך DAO |
| סנכרון | ObjectBox Sync (מסחרי) | Firebase, ידני |
| זמן הגדרה טיפוסי | 3–5 ימים | 5–10 ימים |
בעיות נפוצות ופתרונות
| בעיה | פתרון |
|---|---|
| ID אינו UUID | ObjectBox מקצה מזהה Long אוטומטית — הם ייחודיים רק מקומית. לסנכרון שרת, הוסף שדה מחרוזת נפרד עם @Index. |
| יצירת קוד בכל בנייה | התוסף יוצר MyObjectBox.java ומחלקות _. אם הסכמה משתנה אך מטמון gradle לא נמחק, המהדר מתלונן על אי-התאמה. Tag_ פותר זאת. |
| רק BoxStore אחד לכל אפליקציה | ניסיון לפתוח BoxStore שני על אותו קובץ זורק חריגה. Singleton דרך מחלקת Application הוא חובה. |
למה ObjectBox מתאים לאפליקציות IoT?
מכשירי IoT מייצרים נתוני סדרות זמן בזרם: קואורדינטות, קריאות חיישנים, יומנים. ObjectBox מטפל בהכנסות בכמות גדולה ללא עיכובים, ומנויים ריאקטיביים מעדכנים את ממשק המשתמש באופן מיידי. במעקב שבנינו, כתיבת 500 נקודות לדקה לא גרמה לגמגום — בניגוד ל-Room, שבו GC הוביל לקפיאות. ObjectBox זמין גם עבור Flutter ו-React Native, מה שמפשט פיתוח חוצה-פלטפורמות.
מה כלול בעבודה
- עיצוב מודל אובייקטים עם קשרים
- הגדרת BoxStore, יצירת קוד, אופטימיזציית אינדקסים
- יישום שאילתות ריאקטיביות (LiveData/Flow)
- שילוב ObjectBox Sync (אם נדרש)
- בדיקות ביצועים (מדדים לפני/אחרי)
- תיעוד על סכמה וגישה
- תמיכה ל-30 יום לאחר המסירה
הזמן הגדרת ObjectBox לאפליקציה הניידת שלך — אנו מבטיחים תוצאות. במשך יותר מ-5 שנים אנו עוסקים בפיתוח נייד ומסרנו 50+ פרויקטים על ObjectBox וחלופות. קבל הערכה — כתוב לנו!







