ObjectBox là cơ sở dữ liệu NoSQL hiệu suất cao được tối ưu hóa cho thiết bị di động và edge. Không giống SQLite, nó sử dụng định dạng lưu trữ tệp phẳng riêng mà không có lớp SQL. Theo ObjectBox Benchmarks, 2024, ObjectBox thực hiện các thao tác chèn và đọc nhanh hơn SQLite từ 10–100 lần trên thiết bị Android, khiến nó trở thành lựa chọn tốt nhất cho các ứng dụng di động có tải cao.
Những điểm chính
ObjectBox là cơ sở dữ liệu NoSQL trong bộ nhớ được phát triển bởi công ty Đức ObjectBox.io. Không giống các cơ sở dữ liệu quan hệ truyền thống, ObjectBox lưu trữ đối tượng trực tiếp trong các tệp phẳng sử dụng định dạng SLOT (Super Lightweight Object Tree) riêng. Điều này loại bỏ chi phí của ORM và phân tích cú pháp SQL. Định dạng SLOT được tối ưu hóa cho thiết bị có bộ nhớ hạn chế: dữ liệu được chống phân mảnh tự động và kích thước cơ sở dữ liệu trung bình nhỏ hơn 4–6 lần so với cơ sở dữ liệu SQLite tương đương với cùng số lượng bản ghi.
ObjectBox hỗ trợ tất cả các nền tảng di động chính: Android, iOS và Flutter. Đối với Android, tính năng tạo mã có sẵn thông qua ObjectBox Gradle Plugin, plugin này xử lý các thực thể được chú thích và tạo các lớp Box để làm việc với dữ liệu. Đối với Flutter, một plugin gốc với trình bao bọc Dart được sử dụng. Ngoài các nền tảng di động, ObjectBox chạy trên Linux, macOS, Windows và WebAssembly, cho phép tái sử dụng mô hình dữ liệu giữa ứng dụng di động và đồng bộ hóa máy chủ.
Theo nghiên cứu của ObjectBox (2023), cơ sở dữ liệu được sử dụng trong hơn 5.000 ứng dụng trên Google Play, bao gồm các ứng dụng có hơn 10 triệu người dùng. Các trường hợp sử dụng chính: lưu đệm dữ liệu, hoạt động ngoại tuyến và lưu trữ chuỗi thời gian (IoT). ObjectBox đặc biệt phổ biến trong các ứng dụng theo dõi sức khỏe và thể dục, yêu cầu ghi nhanh chỉ số cảm biến trên thiết bị mà không cần kết nối Internet liên tục và thu thập phân tích từ nhiều thiết bị.
ObjectBox ra đời như một giải pháp thay thế cho Realm và SQLite trên nền tảng Android. Phiên bản ổn định đầu tiên được phát hành vào năm 2018. Sự khác biệt chính so với Realm là ObjectBox không có hạn chế GPL (sử dụng Apache 2.0) và hỗ trợ nhiều nền tảng hơn: từ thiết bị di động đến máy chủ Linux.
ObjectBox cung cấp: tự động tạo lớp Box, chỉ mục tích hợp để tìm kiếm nhanh, giao dịch với hỗ trợ khôi phục, truy vấn phản ứng qua RxJava và Kotlin Flow, và đồng bộ hóa giữa các thiết bị qua ObjectBox Sync (giao thức độc quyền). Không giống Firebase Realtime Database, ObjectBox Sync hoạt động theo mô hình peer-to-peer không có máy chủ trung tâm, giảm độ trễ và chi phí hạ tầng.
ObjectBox lưu trữ dữ liệu ở định dạng nhị phân riêng .mdb (ObjectBox Data File). Mỗi thực thể được ánh xạ vào một tệp, nơi các bản ghi được lưu trữ tuần tự với độ lệch cố định. Điều này cho phép đọc và ghi các đối tượng riêng lẻ mà không cần quét toàn bộ tệp.
Làm việc với ObjectBox không cần SQL: các truy vấn được xây dựng thông qua API fluent trong mã. Trình biên dịch tạo các lớp trợ giúp MyObjectBox và Boxes bao bọc tất cả các thao tác CRUD. Mô hình dữ liệu được mô tả thông qua chú thích @Entity, @Id, @Index và @Relation.
// Connecting ObjectBox in Android
class App: Application() {
lateinit var boxStore: BoxStore
override fun onCreate() {
super.onCreate()
boxStore = MyObjectBox.builder()
.androidContext(this)
.build()
}
}
Theo các benchmark chính thức, ObjectBox vượt trội đáng kể so với SQLite về tốc độ, đặc biệt trong chèn hàng loạt và đọc khối lượng lớn. Tuy nhiên, SQLite vẫn là tiêu chuẩn thực tế cho các ứng dụng di động nhờ tính phổ biến và hỗ trợ SQL tích hợp.
| Thao tác | ObjectBox | SQLite | Khác biệt |
|---|---|---|---|
| Chèn (1000 bản ghi) | ~5 ms | ~180 ms | nhanh hơn ×36 |
| Đọc (1000 bản ghi) | ~3 ms | ~70 ms | nhanh hơn ×23 |
| Cập nhật (1000 bản ghi) | ~6 ms | ~150 ms | nhanh hơn ×25 |
| Tìm kiếm theo chỉ mục | ~0.1 ms | ~2 ms | nhanh hơn ×20 |
| Kích thước DB (1000 đối tượng) | ~28 KB | ~112 KB | nhỏ hơn 4 lần |
ObjectBox kém hơn SQLite trong các tình huống cần truy vấn JOIN phức tạp, hàm tổng hợp (SUM, COUNT với nhóm) hoặc tích hợp với lược đồ SQL hiện có. Nếu dự án đã sử dụng SQLite với Room ORM, việc di chuyển sang ObjectBox sẽ yêu cầu viết lại toàn bộ logic truy cập dữ liệu. ObjectBox cũng không hỗ trợ truy vấn SQL tùy chỉnh — chỉ API fluent. Tuy nhiên, đối với các thao tác CRUD điển hình và lưu đệm, ObjectBox cải thiện hiệu suất lên đến 100 lần, được xác nhận bởi các benchmark chính thức trên thiết bị Android với các phiên bản hệ điều hành khác nhau.
ObjectBox sử dụng chú thích để định nghĩa các thực thể. Sau khi biên dịch, các lớp Box được tạo ra với các phương thức put, get, remove và query. Dưới đây là các thao tác điển hình cho mô hình Task trong ứng dụng danh sách việc cần làm.
Mỗi thực thể được chú thích với @Entity. Trường có @Id trở thành khóa chính và @Index tăng tốc tìm kiếm trên trường đó. ObjectBox hỗ trợ tạo ID tự động khi giá trị là 0.
@Entity
data class Task(
@Id var id: Long = 0,
@Index var title: String = "",
var isCompleted: Boolean = false,
var priority: Int = 0
)
Box là lớp chính để làm việc với thực thể. Phương thức put() lưu hoặc cập nhật đối tượng, get() đọc theo ID và remove() xóa. Tất cả thao tác cơ bản đều đồng bộ và thực thi trên luồng gọi.
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 hỗ trợ truy vấn phản ứng qua .subscribe(). Người đăng ký nhận thông báo khi dữ liệu khớp với điều kiện truy vấn thay đổi. Điều này thuận tiện cho giao diện người dùng tự động cập nhật danh sách khi các mục được thêm hoặc xóa.
val query = taskBox.query()
.equal(Task_.isCompleted, false)
.orderDesc(Task_.priority)
.build()
query.subscribe { tasks ->
// tasks — List, tự động cập nhật
updateUi(tasks)
}
ObjectBox hỗ trợ quan hệ giữa các thực thể — Một-Một, Một-Nhiều và Nhiều-Nhiều. Quan hệ được định nghĩa qua chú thích @Relation. Không giống SQLite, ObjectBox không sử dụng khóa ngoại: quan hệ được triển khai qua danh sách ID trong tệp phẳng, tăng tốc điều hướng đồ thị đối tượng.
Quan hệ @Backlink cho phép đi từ thực thể con đến thực thể cha mà không cần trường tham chiếu riêng. ObjectBox tự động duy trì backlink, loại bỏ trùng lặp dữ liệu và đồng bộ hóa giữa hai bảng.
ObjectBox Query Builder cho phép xây dựng chuỗi điều kiện: equal, notEqual, greater, less, in, contains, startsWith. Tất cả điều kiện có thể kết hợp qua and/or. Kết quả có thể được sắp xếp, giới hạn và lấy dưới dạng List hoặc LazyList (cho tập dữ liệu lớn).
ObjectBox tự động đánh chỉ mục trường @Id. Đối với chỉ mục tùy chỉnh, sử dụng chú thích @Index trên các trường thường xuyên được truy vấn. Chỉ mục tăng tốc truy vấn equal và in nhưng làm chậm chèn — không đánh chỉ mục các trường không được tìm kiếm. ObjectBox hỗ trợ chỉ mục tổng hợp để lọc theo nhiều trường cùng lúc. Chỉ mục tổng hợp đặc biệt hữu ích cho bộ lọc danh sách: ví dụ, tìm kiếm tác vụ chưa hoàn thành có mức ưu tiên cao nhanh hơn hàng chục lần với chỉ mục tổng hợp trên các trường isCompleted và priority.
ObjectBox Sync là công nghệ độc quyền để đồng bộ hóa dữ liệu thời gian thực giữa các thiết bị. Nó sử dụng giao thức dựa trên WebSocket với giải quyết xung đột theo last-writer-wins. Sync phù hợp cho các ứng dụng cần đồng bộ hóa ngoại tuyến: ghi chú, danh sách tác vụ, dữ liệu IoT từ nhiều cảm biến. Tuy nhiên, cần mua giấy phép cho môi trường sản xuất.
// 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()
Câu hỏi thường gặp
ObjectBox được phân phối theo giấy phép Apache 2.0, cho phép sử dụng thương mại mà không bị hạn chế. Tính năng ObjectBox Sync (đồng bộ hóa đa nền tảng) là độc quyền và yêu cầu mua giấy phép cho môi trường sản xuất.
BoxStore an toàn cho luồng: nhiều luồng có thể đọc dữ liệu đồng thời. Ghi bị khóa ở cấp Box. Đối với giao dịch phức tạp, sử dụng boxStore.runInTx(), đảm bảo tính nguyên tử của một nhóm thao tác.
Có, ObjectBox hỗ trợ Kotlin Multiplatform (KMP) từ phiên bản 3.0. Các nền tảng đích có sẵn: Android, iOS, JVM và Native. Đối với KMP, một plugin Gradle riêng objectbox-kotlin với hỗ trợ expect/actual được sử dụng.
ObjectBox lưu trữ dữ liệu trong các tệp .mdb trong thư mục ứng dụng. Để sao lưu, hãy sao chép toàn bộ thư mục ObjectBox qua BoxStore.copy() hoặc sao chép thủ công các tệp sau khi gọi boxStore.close(). Không thể sao chép tệp đang hoạt động — điều này sẽ làm hỏng dữ liệu.
Room là ORM trên nền SQLite, yêu cầu truy vấn SQL và có chi phí ánh xạ đối tượng. ObjectBox là cơ sở dữ liệu NoSQL không cần SQL, nhanh hơn một bậc độ lớn, nhưng không hỗ trợ JOIN phức tạp và không phải là cơ sở dữ liệu quan hệ. Lựa chọn phụ thuộc vào nhiệm vụ: cho dữ liệu quan hệ — Room, cho lưu trữ đối tượng nhanh — ObjectBox.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm