Xamarin – So sánh mobile ORM: SQLite.NET và Realm

Từ bài viết: http://blog.appconus.com/2015/08/06/gioi-thieu-realm-giai-phap-thay-the-cho-sqlite-2/
Thì bạn có thể thấy thì: trước đây khi làm với mobile db người ta chỉ nghỉ tới SQLite và giờ đây là Realm (bên cạnh đó có CouchDb Lite nhưng ít ai dùng).
Vì vậy hôm nay mình xin được viết bài so sánh giữa 2 thư viện này để bạn quyết định lựa chọn cái nào là phù hợp với yêu cầu project của mình.

Cài đặt

SQLite.Net

Để cài đặt SQLite.Net bạn cài đặt có nuget package: SQLite.Net-PCL, SQLite.Net.Core-PCL and SQLite.Net.Async-PCL (cái này là trong trường hợp bạn muốn dùng các hàm SQLite async).

Vậy nên mình quyết định thử so sánh 2 thư viện này thế nào: SQLite và Realm.

Realm

Đơn giản hơn bạn chỉ cần cái nuget package Realm là đủ.

Hỗ trợ async

SQLite.Net

Để hỗ trợ async bạn phải cài thêm thư viện SQLite.Net.Async-PCL.

Realm

Chỉ hỗ trợ write async, không hỗ trợ read async. Chắc có lẽ vì nó qua nhanh chăng :D. Nhưng bạn thích thì bạn có thể tự async nó cũng được mà 🙂

Hỗ trợ dữ liệu quan hệ

Với bất kỳ ORM nào thì việc hỗ trợ các thao tác liên quan đến dữ liệu quan hệ (association realationships) như: một-một, một-nhiều, nhiều-nhiều,… thì rất cần thiết và sẽ hiệu quả hơn thay vì làm thủ công

SQLite.Net

Bạn phải cài đặt thêm thư viện nuget: SQLite-Net Extensions và SQLite-Net Extensions.Async (nếu muốn xử lý asyn). Và việc cài đặt phải tuân thủ theo spec của thư viện: https://bitbucket.org/twincoders/sqlite-net-extensions

Bạn có thể thấy hơi phức tạp 1 chút, bạn phải bỏ thêm nhiều attribute để cấu hình relationships.
Ví dụ:

Realm

Bạn không cần phải cài thêm bất cứ component:

Ví dụ:

Có thể thấy Realm đơn giản hơn rất nhiều, bạn không cần phải cấu hình realation ship như bên SQLite.Net, tuy nhiều điều mình không thích ở đây chính là một class entity phải thừa kế từ RealmObject.

Hiệu năng

SQLite.Net

Tương đối chậm, đặc biệt khi dùng các hàm của extension (InsertAllWithChildren, GetAllWithChildren). Mình phải tối ưu một số chỗ để tăng tốc độ insert.

Realm

Quá nhanh đến chóng mặt, chắc đó là lý do vì sao nó chả cần phải xử lý async 😀

Class design

Ở SQLite.Net, các class của database không cần phải thừa kế từ một lớp nào cả (kiếu POCO đơn giản), tất cả đều config thông qua attribute.
Tuy nhiên trong Realm thì tất cả các class đều phải thừa kế từ RealmObject. Từ khung nhìn thiết kế hệ thống thì việc giảm thiểu sự phụ thuộc vào thư viện là rất cần thiết. Đó là lý do người ta vẫn thích dùng SQLite.NET hơn. Nếu bạn không thích thừa kế trong Realm thì bạn có thể tạo mapping nhưng lại tạo ra duplicated code.

Kết Luận

Nếu bạn thích đơn giản và hiệu năng cao, Realm là sự lựa chọn tuyệt vời. Nhưng nếu bạn thích một thư viện mà bạn có thể giảm thiểu được sự phụ thuộc vào nó khi thiết kế hệ thông thì SQLite.NET là sự lựa chọn tối ưu.

P/S: Cá nhân mình chọn SQLite.NET, còn bạn thì sao?

Mã nguồn

Mã nguồn cho bài viết: https://github.com/QuanTran91/Xamarin.ORMComparision

Tham khảo

http://mobilefirstcloudfirst.net/2016/05/xamarin-apps-sqlite-vs-realm-whats-the-best-mobile-db-solution/

https://realm.io/docs/xamarin/latest/
https://bitbucket.org/twincoders/sqlite-net-extensions

Spread the love
  •  
  •  
  •  
  •  
  •  

Leave a Reply

1 Comment on "Xamarin – So sánh mobile ORM: SQLite.NET và Realm"

Notify of
avatar
Sort by:   newest | oldest | most voted
Cao Quảng Bình
Admin

Sao không demo khoảng 1m user để thấy rõ được sự khác biệt về tốc độ?

Nhìn mấy con số loằng ngoằng kia hoa mắt quá :3