12/08/2018, 13:32

Realm - A replacement for SQLite & Core Data

Trước đây chúng ta đều đã biết SQLite là một cơ sở dữ liệu tốt để lưu trữ dữ liệu trong bộ nhớ trong. Nhưng thời gian đã thay đổi, và bây giờ, Realm là một phương pháp tuyệt vời để thay thế cho SQLite . Trước đây, để làm việc với SQLite, chúng ta phải thực hiện rất nhiều thao tác: xây ...

Realm.png

Trước đây chúng ta đều đã biết SQLite là một cơ sở dữ liệu tốt để lưu trữ dữ liệu trong bộ nhớ trong. Nhưng thời gian đã thay đổi, và bây giờ, Realm là một phương pháp tuyệt vời để thay thế cho SQLite.

Trước đây, để làm việc với SQLite, chúng ta phải thực hiện rất nhiều thao tác: xây dựng khung chương trình, mô hình, helper, truy vấn,... Điều này đòi hỏi rất nhiều thời gian trong quá trình phát triển phần mềm. Những người mới tìm hiểu SQLite sẽ bỏ ra khá nhiều thời gian trong việc khởi tạo, nhập xuất, tạo các truy vấn và đặc biệt là code sẽ dài và rất khó quản lý.

Để khắc phục điều đó, giải pháp cần phải áp dụng đó là:

  • Viết thư viện dùng chung, hỗ trợ các thao tác lặp đi lặp lại này để giảm thời gian phát triển, giúp cho việc tương tác với SQLite tốt hơn, code dễ bảo trì hơn.
  • Sử dụng thư viện ORM (Object Relational Mapping): ORM giúp cho việc ánh xạ các bảng trong SQLite vào các model, mọi thao tác với SQLite bây giờ được thực hiện qua các đối tượng này. Tuy nhiên, việc sử dụng ORM phát sinh vấn đề về hiệu năng và độ ổn định.

Từ đó, Realm đã ra đời, nhằm khắc phục những nhược điểm đó của SQLite ^^.

Những lợi ích của Realm khi ra đời

  • Đơn giản, dễ dàng sử dụng: Thiết kế của Realm giúp bạn có thể dễ dàng sử dụng: dữ liệu trực tiếp được thao tác là đối tượng và truy vấn bằng code. Realm chỉ làm việc với 3 lớp chung (Object, Array và Realms) và một lớp tiện ích (Migrations).

Hơn nữa, Realm cung cấp một số chức năng mạnh mẽ khác, bao gồm object relationships, nó có nghĩa là bạn có thể ánh xạ một nhiều hoặc nhiều nhiều (1-n hoặc n-n). Realm cung cấp khả năng có thể di chuyển dữ liệu sang một thiết bị khác, như vậy bạn có thể dễ dàng cập nhật dữ liệu của bạn. Còn nữa, Realm là safe across threads, giúp bạn có thể dễ dàng đồng bộ hóa các tác vụ trong ứng dụng của bạn.

Hãy xem thử một số ví dụ về việc sử dụng Realm trong JAVA sau đây để thấy được điều đó nha:

// Định nghĩa một model class thừa kế RealmObject
public class Dog extends RealmObject {
    private String name;
    private int age;

    // ... Generated getters and setters ...
}

public class Person extends RealmObject {
    @PrimaryKey
    private long id;
    private String name;
    private RealmList<Dog> dogs; // Khai báo quan hệ một - nhiều

    public Person(long id, String name) {
        this.id = id;
        this.name = name;
    }

    // ... Generated getters and setters ...
}

// Sử dụng chúng như các object Java thông thường
Dog dog = new Dog();
dog.setName("Rex");
dog.setAge(1);

// Tạo một RealmConfiguration để lưu trữ file của Realm trong thư mục "files" của ứng dụng
RealmConfiguration realmConfig = new RealmConfiguration.Builder(context).build();
Realm.setDefaultConfiguration(realmConfig);

// Tạo một instance của Realm
Realm realm = Realm.getDefaultInstance();

// Truy vấn tất cả các chú chó nhỏ hơn 2 tuổi
final RealmResults<Dog> puppies = realm.where(Dog.class).lessThan("age", 2).findAll();
puppies.size(); // => 0

// Persist dữ liệu của bạn trong một transaction
realm.beginTransaction();
final Dog managedDog = realm.copyToRealm(dog); // Persist các object không được quản lý
Person person = realm.createObject(Person.class); // Tạo trực tiếp các object được quản lý
person.getDogs().add(managedDog);
realm.commitTransaction();

// Listeners sẽ được thông báo khi dữ liệu thay đổi
puppies.addChangeListener(new RealmChangeListener<RealmResults<Dog>>() {
    @Override
    public void onChange(RealmResults<Dog> results) {
        // Kết quả truy vấn được cập nhật thời gian thực
        puppies.size(); // => 1
    }
});

// Cập nhật các object không đồng bộ trên một background thread
realm.executeTransactionAsync(new Realm.Transaction() {
    @Override
    public void execute(Realm bgRealm) {
        Dog dog = bgRealm.where(Dog.class).equals("age", 1).findFirst();
        dog.setAge(3);
    }
}, new Realm.Transaction.OnSuccess() {
    @Override
    public void onSuccess() {
      // Các truy vấn ban đầu và những object Realm sẽ được tự động cập nhật
      puppies.size(); // => 0
      managedDog.getAge();   // => 3
    }
});
  • Nhanh: Nhờ có thiết kế "zero-copy" (không tạo bản sao khi truy vấn), Realm nhanh hơn nhiều so với một ORM, và SQLite thuần. Hãy xem bảng so sánh hiệu năng sau đây để thấy rõ điều đó:

Truy vấn Counts 150.000 records Realm1.png

Insert 150.000 records realm2.png

Như các bạn có thể thấy, các chỉ số đo đạc trên cùng một thiết bị phần cứng, cùng một OS, Realm luôn bỏ xa các phần còn lại             </div>
            
            <div class=

0