12/08/2018, 15:58

Giới thiệu Realm – Giải pháp thay thế cho SQLite

Bối cảnh Để làm việc với SQLite, 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, heplers, truy vấn, blah blah. Thực sự việc này tốn rất nhiều thời gian trong tiến trình phát triển phần mềm. Những người mới tiếp cận với SQLite sẽ phải bỏ ra nhiều giờ loay hoay trong ...

Bối cảnh

  • Để làm việc với SQLite, 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, heplers, truy vấn, blah blah. Thực sự việc này tốn rất nhiều thời gian trong tiến trình phát triển phần mềm. Những người mới tiếp cận với SQLite sẽ phải bỏ ra nhiều giờ loay hoay trong khởi tạo, nhập xuất, xây dựng câu truy vấn và đặc biệt là code sẽ rất khó quản lý.

Giải pháp trước kia

1.Viết thư viện hỗ trợ

  • Viết ra một thư viện chung, hỗ trợ cho các thao tác lặp đi lặp lại này để giảm thiểu thời gian phát triển đồng thời giúp tương tác với SQLite tốt hơn, code dễ bảo trì hơn…

2.Sử dụng thư viện ORM (Object Relational Mapping)

  • ORM thực sự hữu ích khi chuyển (ánh xạ) các bảng trong SQLite vào các đối tượng (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 ra vấn đề về hiệu năng, độ ổn định. ActiveAndroid là một ví dụ.

Realm – Giải pháp thay thế cho SQLite

ealm is a replacement for SQLite & Core Data. It can save you thousands of lines of code & weeks of work, and lets you craft amazing new user experiences.

  • Realm là một cơ sở dữ liệu (CSDL) nguồn mở, sử dụng ORM, hoàn toàn miễn phí khi sử dụng, kể cả những sản phẩm thương mại. Realm lưu dữ liệu trên bộ nhớ trong. Realm hỗ trợ đa nền tảng (hiện tại là Android, iOS, OSX), file CSDL có thể chia sẻ dễ dàng giữa các nền tảng trên.

  • Realm luôn giữ tư tưởng nâng cao hiệu năng và giữ vững độ ổn định. Kết quả benchmark (có source code) cho thấy Realm nhanh hơn khoảng 2-10 lần trong các tác vụ đọc, ghi so với SQLite thuần và một số thư viện ORM phổ biến hiện nay. Việc làm quen, tiếp cận với Realm cực kỳ dễ dàng và đơn giản. Vậy Realm còn có gì để tự tin tuyên bố mình là giải pháp thay thế cho SQLite?

Cộng đồng hỗ trợ đông đảo, nhiệt tình

  • Nếu có bất cứ vấn đề, thắc mắc gì, bạn sẽ được hỗ trợ trực tiếp bởi các lập trình viên phát triển Realm, và cộng đồng nguồn mở trên github và Stack Over Flow.

  • Dữ liệu được kết nối trực tiếp tới CSDL chứ không tạo ra bản sao khi truy vấn.

  • Do đó, các thao tác với dữ liệu sau khi truy vấn (tìm kiếm, sắp xếp, lọc,…) đều được thực hiện thẳng trên CSDL, do đó, tốc độ thực thi sẽ tăng lên đáng kể.

  • Các lớp của Realm hỗ trợ nhiều trong việc tránh lỗi Null Pointer Exception.

  • Khi truy vấn không có kết quả, đối tượng RealmResults được trả về sẽ là rỗng, và phương thức size() sẽ cho ra 0.

  • Hỗ trợ in-memory database

  • Trong một số trường hợp, chúng ta chỉ cần tạo một CSDL tạm, cần tương tác (đọc/ghi) nhanh hơn nữa, chúng ta sẽ cần đến việc giữ CSDL trong bộ nhớ RAM (in-memory database). * Realm hoàn toàn hỗ trợ giải pháp này.

  • Hỗ trợ tạo model từ JSON hoặc từ InputStream (đọc từ file, tải từ trên mạng về) Tương thích tốt với các thư viện thông dụng đang có (Gson, Retrofit, Otto, Robolectric…), hỗ trợ tích hợp tuỳ chỉnh

  • Bạn có thể định nghĩa cách các thư viện này tương tác với nhau, do đó bạn sẽ dùng các thư viện theo đúng ý mình muốn. Hỗ trợ custom migrating

  • Việc cập nhật CSDL, thêm/bớt các bảng, trường đều được hỗ trợ một cách thuận tiện, đơn giản nhất bằng cách kế thừa lớp RealmMigration. Hỗ trợ mã hoá file CSDL

  • Hiện tại, Realm sử dụng AES-256 để mã hoá file CSDL.

  • Tài liệu đầy đủ, chi tiết

  • Bạn có thể bắt tay tích hợp Realm vào dự án của bạn ngay chỉ sau nửa giờ đọc tài liệu hướng dẫn. Documentation cũng rất chi tiết, cụ thể và chuyên nghiệp. Ngoài ra, Pealm cũng viết sẵn luôn các ví dụ mẫu trên github.

Add libs

compile 'io.realm:realm-android:0.82.0'

**Mình sẽ viết ra 1 ví dụ đơn giản về Realm ** Example:

public class User extends RealmObject {
 
    @PrimaryKey
    private String name;
    private int age;
 
    @Ignore
    private int sessionId;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public int getSessionId() {
        return sessionId;
    }
 
    public void setSessionId(int sessionId) {
        this.sessionId = sessionId;
    }
}
public class MainActivity extends ActionBarActivity {
    private static final String TAG = "MainActivity";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        writeToDb();
        readFromDb();
    }
 
    private void writeToDb() {
        Realm realm = Realm.getInstance(this);
        realm.beginTransaction();
        User user = realm.createObject(User.class);
        user.setSessionId(1);
        user.setName("Kieu");
        user.setAge(23);
        realm.commitTransaction();
    }
 
    private void readFromDb() {
        Realm realm = Realm.getInstance(this);
        User user = realm.where(User.class).findFirst();
        Log.d(TAG, "Got user: " + user.getName());
    }
}

Log cat output:

 MainActivity﹕ Got user: Kieu

Bài sau mình sẽ hướng dẫn các bạn làm chi tiết hơn.

0