Realm, ObjectBox hay Room

1. Realm

Kể từ khi bắt đầu thai nghén (khoảng năm 2011, ban đầu là "TightDB") Realm đã được chọn bới nhiều developer. Lý do ư? Đơn giản (sử dụng hầu hết các đối tượng Java chuẩn), tốc độ (viết chủ yếu trong C ++) và SQL (không có gì). Nếu không đi vào chi tiết quá nhiều, tạo ra một cơ sở dữ liệu với Realm là đơn giản.

Một model cho các đối tượng để lưu trữ là điều đầu tiên cần thiết:

open class Box (
@PrimaryKey var size: Long = 0, 
var name: String = "", 
@Ignore var tempReference: Int = 0) : RealmObject() {}

Điều duy nhất đáng lưu ý ở đây là nếu bạn sử dụng Kotlin, tất cả các biến phải có các giá trị mặc định. Các annotation và thừa kế cần thiết của RealmObject là tự giải thích, vì vậy hãy tiếp tục. Sử dụng Realm đơn giản như sau:

Realm.init(context)
val realm = Realm.getDefaultInstance()
val box = realm.where(Box::class.java).findFirst()
realm.executeTransaction {
//modifying an exsiting object
 box.size = 20
 box.name = "John"
//creating a new object
 val secondBox = realm.createObject(Box::class.java)
 secondBox.size = 30
}

2. Thư viện Room Persistence

Enter Room! Các thư viện mới nhất của Google. Room cung cấp một lớp trừu tượng trên SQLite cho phép truy cập cơ sở dữ liệu trong khi khai thác toàn bộ sức mạnh của SQLite. Nó làm một công việc khá tốt của tucking SQL và clean method của Java, dễ hiểu để phát triển. Vì vậy, hãy nhớ không có truy vấn? Bây giờ chúng ta sẽ viết một số truy vấn! Nhưng đừng lo, Room có một số tính năng an toàn cảnh báo bạn trong trường hợp có những sai lầm khó chịu.

Có 3 thành phần chính trong Room, tất cả được thể hiện dưới dạng chú thích:

Cơ sở dữ liệu: Bạn có thể sử dụng thành phần này để tạo một database holder. Chú thích định nghĩa danh sách các thực thể và nội dung của class - danh sách các đối tượng truy cập dữ liệu (DAO) trong cơ sở dữ liệu. Nó cũng là điểm truy cập cho các kết nối cơ bản. Class chú giải phải là một lớp trừu tượng mở rộng RoomDatabase. Bạn có thể có được một thể hiện của nó bằng cách gọi Room.databaseBuilder () hoặc Room.inMemoryDatabaseBuilder ().

Entity: Thành phần này đại diện cho một lớp chứa một hàng của cơ sở dữ liệu. Đối với mỗi entity, một bảng cơ sở dữ liệu được tạo ra để chứa các mục. Bạn phải reference lớp entity thông qua mảng các thực thể trong lớp Cơ sở dữ liệu.

DAO: Thành phần này đại diện cho một lớp hoặc interface như là một đối tượng truy cập dữ liệu. Các DAO có trách nhiệm xác định các phương pháp truy cập cơ sở dữ liệu. Các lớp được chú thích với @Database phải chứa một phương pháp trừu tượng có 0 đối số và trả về lớp được chú thích với @Dao.

Sau đây là 3 implementation:

@Entity(tableName = “task”)
data class Task(@ColumnInfo(name = “completed_flag”) var completed: Boolean = false,
 @ColumnInfo(name = “task_desciption”) var description: String) {
 @ColumnInfo(name = “id”)
 @PrimaryKey(autoGenerate = true) var id: Long = 0
}
@Dao interface TaskDao {
 @Query(“select * from task”)
 fun getAllTasks(): List<Task>
@Query(“select * from task where id = :p0”)
 fun findTaskById(id: Long): Task
@Insert(onConflict = REPLACE)
 fun insertTask(task: Task)
@Delete
 fun deleteTask(task: Task)
}
@Database(entities = arrayOf(Task::class), version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun taskDao(): TaskDao
}

Tạo một cơ sở dữ liệu và gọi các phương thức của nó đơn giản như sau:

var database = Room.databaseBuilder(context, AppDatabase::class.java,”db”).allowMainThreadQueries().build()
database.taskDao().insertTask( Task(description = “simple!”) )

3. ObjectBox

ObjectBox mang lại rất nhiều cho table. Có thể công nghệ mới NoSQL này so sánh với cựu chiến binh trong lĩnh vực này?

Tốc độ: Cũng giống như Realm, ObjectBox mang lại hiệu suất tuyệt vời, đôi khi thậm chí vượt trội so với đối thủ cạnh tranh của nó.

QueryBuilder: Với ObjectBox bạn chỉ cần truy vấn các đối tượng có kiểm tra tại compile time.

Quan hệ đối tượng: Tham chiếu đối tượng / mối quan hệ là một kiểu được xây dựng sẵn; nó là tài liệu tham khảo tự nhiên.

Không có schema migration thủ công: Chăm sóc các phiên bản đối tượng mới với các thuộc tính được thêm, xóa và đổi tên.

Vậy nó trông như thế nào trong thực tế?

@Entity
data class Note (
 @Id var id: Long = 0,
 val text: String
)

ObjectBox làm việc với các đối tượng được gọi là Boxes để lưu trữ và làm việc với dữ liệu. Chỉ có 2 dòng phân chia bạn làm việc với cơ sở dữ liệu:

Đối tượng "Box Store" tốt hơn nên nằm trong lớp Application:

MyObjectBox.builder (). AndroidContext (App.this) .build ()

Và cá nhân "Boxes" cho mỗi mô hình trong cơ sở dữ liệu. Các box này sẽ phục vụ như là một điểm tương tác giữa bạn và cơ sở dữ liệu.

var notesBox = boxStore.boxFor (Chú ý :: class.java)

Một chi tiết quan trọng là các loại Box này được tạo tự động, có nghĩa là ít điều phải lo lắng!

notesBox.put(note)
notesBox.remove(note)
notesBox.count()

4. Comparison

Một số kết quả khá thú vị? Như rõ ràng từ các test, hầu hết, ObjectBox nghiền nát tất cả các cạnh tranh. Và, tất nhiên, khoảng cách càng trở nên rộng hơn thì càng có nhiều yếu tố được test!

Truy vấn dường như cũng là một trong những mặt mạnh của ObjectBox. Các test với chuỗi và index.

Còn về kích thước apk? Mỗi thư viện này sẽ làm chậm lại dự án của chúng ta bao nhiêu?

ObjectBox và Realm mất tới 1-1,5MB và 3-4MB tương ứng (kích thước phụ thuộc vào phone architecture), trong khi Room, là một wrapper SQL, chỉ chiếm khoảng 50KB. Nhưng chúng ta cũng phải tuân theo giới hạn về số lượng method gây phiền phức. Về vấn đề đó, Room một lần nữa dường như dẫn dắt cuộc chạy đua với số lượng method khiêm tốn: 300. Trong khi ObjectBox với 1300 và Realm với 2000 method.

Room cung cấp mọi thứ bạn có thể làm với SQLite. Có cơ chế migration, và nó là tất nhiên, hoàn toàn testable. Ngược lại, ObjectBox thậm chí không cần, bởi vì nó tự xử lý hầu hết các migration (mặc dù cho một số migration, nó đòi hỏi thông tin bổ sung). Realm mang đến một kho vũ khí đầy ấn tượng bao gồm các cấu hình tùy chỉnh, mã hóa và nhiều hơn nữa (một trong những lý do cho kích thước của nó).

5. Conclusion

Bất kỳ thư viện nào, cũng có điểm mạnh, điểm yếu riêng. Nếu bạn đang tìm kiếm tốc độ và hiệu quả, ObjectBox là một sự lựa chọn rõ ràng. Tuy nhiên, nếu bạn bị giới hạn bởi kích thước ứng dụng, đạt đến giới hạn method 64k và tất nhiên, nếu bạn sẵn sàng đối phó với SQL, Room có thể là một giải pháp cho bạn. Mặt khác, Realm, có thể không phải là nhanh nhất, cũng không phải là nhỏ nhất, nhưng cung cấp các giải pháp ổn định nhất, bug free với hơn 7 năm gỡ lỗi và cải tiến.