COVER: REALM - A MOBILE DATABASE AND A REPLACEMENT FOR SQLITE & CORE DATA (P1)

I. GIỚI THIỆU

Tình cờ một hôm đi làm sớm được anh TuyenBQ – anh bên đội iOS cùng team Zenrin với mình chia sẻ một bài viết “REALM – A MOBILE DATABASE AND A REPLACEMENT FOR SQLITE & CORE DATA” do chính anh ấy là tác giả viết về Realm.IO nhưng bài viết trên nền tảng iOS. Vì vậy mình xin được cover lại bài đó trên nền tảng Android.

Realm là gì? Vâng, chính xác thì có thể gọi Realm là một hệ quản trị cơ sở dữ liệu dành cho mobile, một hệ quản trị cơ sở dữ liệu cross-platform có thể hoạt động trên cả 2 nền tảng di động phổ biến hiện nay là iOS và Android. Nó được sinh ra để thay thế cho những huyền thoại như SQLite hay Core Data. Chúng ta cùng xem liệu Realm có phải chỉ là một cái bánh xe được phát minh lại thành hình vuông (facepalm)?

Các ưu điểm của Realm

  • Easy to Use: Xin nhắc lại đó là Realm không phải một thư viện ORM hoạt động ở tầng trên của SQLite mà thay vào đó nó sử dụng một engine lưu trữ quản lý dữ liệu riêng đơn giản nhưng vô cùng nhanh. Người dùng (developers) có thể làm quen, chuyển đổi sang sử dụng Realm một cách cực kỳ nhanh chóng.

  • Fast: Nhờ vào thiết kế zero-copy của nó mà Realm thực sự nhanh hơn ORM rất nhiều và thậm chí tốc độ còn nhanh hơn cả SQLite nguyên thủy.

  • Cross-Platform: Bạn có thể sử dụng Realm để phát triển các ứng dụng trên các nền tảng di động như iOS và Android. Hơn nữa bạn có thể chia sẻ các files dữ liệu giữa các nền tảng.

  • Advance: Realm hỗ trợ các tính năng tiên tiến như mã hóa, graph queries.

  • Trust: Realm được rất nhiều công ty tổ chức lớn tin cậy sử dụng.

  • Ngoài ra Realm là mã nguồn mở và có cộng đồng phát triển chia sẻ rất lớn trên Github, Stackoverflow, Twitter

  • Còn nhiều ưu điểm khác nữa nhưng thôi nói nhiều quá mà không làm ăn gì thì lại thành “nâng bi”. OK, Let’s start use Realm.

BENCHMARK

Nói có sách mách có chứng, dưới đây là kết quả benchmark của Realm với các hệ quản trị cơ sở dữ liệu khác trên Mobile.

  • Count

Screen Shot 2016-04-25 at 8.06.31 AM.png

  • Queries

Screen Shot 2016-04-25 at 8.06.48 AM.png

  • Insert

Screen Shot 2016-04-25 at 8.06.56 AM.png

II. GETTING STARTED

REQUIREMENTS

Realm yêu cầu Android Studio >= 1.5.1 và JDK >=7

MODELS

Khi xây dựng ứng dụng với Realm, Đơn giản nhất đó là các class models của bạn chỉ cần extends lại từ class RealmObject

public class TrackLocation extends RealmObject {

    private float latitude;
    private float longitude;
    private long time;
    private float speed;

    public void setLatitude(float latitude){this.latitude = latitude;}
    public void setLongitude(float longitude)(this.longitude = longitude);
    public void setTime(long time){this.time = time;}
    public void setSpeed(float speed){this.speed = speed;}

    public long getLatitude(){return this.latitude;}
    public long getLongitude(){return this.longitude;}
    public long getTime(){return this.time;}
    public float getSpeed(){return this.speed;}
}

KIỂU DỮ LIỆU

Realm hỗ trợ các kiểu dữ liệu cơ bản trong Java sau đây: boolean, byte, short, ìnt, long, float, double, String, Date và kiểu byte[]. Các kiểu dữ liệu số nguyên như byte, short, int, long sẽ được chuyển đổi hết về kiểu long trong Realm.

Các kiểu dữ liệu boxed như Boolean, Integer, Long … cũng được hỗ trợ và bạn có thể đặt nó thành null.

Với các trường dữ liệu bắt buộc bạn hãy thêm Annotation @Required để báo cho Realm là không chấp nhận giá trị null.

Đôi khi bạn muốn bỏ qua một trường dữ liệu không muốn lưu lại vào database bạn chỉ cần thêm Annotation @Ignore.

AUTO UPDATING OBJECTS

Thực sự thì Realm giống như kênh truyền hình trực tiếp dữ liệu từ ứng dụng đến database. Bất kỳ thay đổi nào ở objects cũng ảnh hưởng ngay lập tức đến database cũng như các queries. Không giống như ORM thì bạn thay đổi dữ liệu trên Model hoặc từ một nơi khác nhưng sẽ cần lưu lại vào database và kết quả của các query không được cập nhật lại.

Hãy cùng xem đoạn code dưới đây, bạn sẽ hiểu:

realm.beginTransaction();
TrackLocation tloc = realm.createObject(TrackLocation.class);
tlog.setTime(1);
tloc.setLatitude(123.4567890f);
tloc.setLongitude(23.647633f);
tloc.setSpeed(0);
realm.commitTransaction();

TrackLocation location2 = realm.where(TrackLocation.class).equals("time", 1).findFirst();
realm.beginTransaction();
location2.setSpeed(20);
realm.commitTransaction();
tloc.getSpeed(); // => 20

INDEXING

Annotation @Index sẽ được thêm vào trường dữ liệu là index việc này sẽ khiến quá trình insert dữ liệu chậm hơn nhưng bù lại truy vấn tìm kiếm rất nhanh. Realm hỗ trợ đánh chỉ mục trên các trường dữ liệu kiểu String, byte, short, int, long, booleanDate.

PRIMARY KEY

Để đánh dấu một trường là primary key chúng ta dùng annotation @PrimaryKey và trường này chỉ có thể là một trong các kiểu dữ liệu String hoặc số nguyên (short, int, long)

HẾT PHẦN I

Bạn có thể tìm hiểu thêm về Realm cho Android tại đây Trong phần 2 chúng ta sẽ cùng làm quen với cách sử dụng, tạo database, thêm sửa xóa, truy vấn trên Realm.