Giới thiệu Realm database cho Android
Bài đăng này đã không được cập nhật trong 3 năm
Giới thiệu
Realm là một cơ sở dữ liệu nhẹ, có thể thay thế cả hai thư viện SQL và ORM trong các ứng dụng Android. Realm không sử dụng SQLite làm engine của nó. Thay vào đó, nó dùng core C++ nhằm mục đích cung cấp một thư viện cơ sở dữ liệu thay thế SQLite.
Realm lưu trữ dữ liệu trong các bảng viết bằng core C++. Việc này cho phép Realm được truy cập dữ liệu từ nhiều ngôn ngữ cũng như một loạt các truy vấn khác nhau.
Dưới đây là những ưu điểm của Realm so với SQLite:
- Nhanh hơn so với SQLite (gấp 10 lần so với SQLite cho các hoạt động bình thường).
- Dễ sử dụng.
- Chuyển đổi đối tượng xử lý cho bạn.
- Thuận tiện cho việc tạo ra và lưu trữ dữ liệu nhanh chóng.
Ngoài ra còn có một số nhược điểm sau :
- Vẫn còn đang phát triển.
- Không có nhiều kênh trao đổi trực tuyến.
- Không thể truy cập các đối tượng thông qua thread.
Sau đây mình sẽ hướng dẫn các bạn sử dụng Realm tuần tự theo các bước sau :
1. Add Realm vào Project
Để sử dụng Realm trong Proejct, bạn cần compile Realm trong file build.gradle
compile 'io.realm:realm-android:0.84.1'
2.Tạo Realm database
Realm cũng tương tự như cơ sở dữ liệu SQLite. Nó sẽ có 1 tập tin liên kết với nó, khi tạo ra, sẽ tồn tại trong hệ thống Android.
Để tạo ra một cơ sở dữ liệu Realm, bạn cần gọi phương thức Realm.getInstance từ chính Activity của bạn :
Realm myRealm = Realm.getInstance(context);
Chú ý rằng gọi Realm.getInstance mà không truyền vào một RealmConfiguration thì sẽ tạo ra một file cơ sở dữ liệu Realm tên là default.realm.
Nếu bạn muốn thêm một Realm khác trong ứng dụng, bạn phải sử dụng một đối tượng RealmConfiguration.Builder và đặt cho nó một cái tên duy nhất :
Realm myOtherRealm =
Realm.getInstance(
new RealmConfiguration.Builder(context)
.name("myOtherRealm.realm")
.build()
);
3. Tạo một RealmObject
Bất kì một đối tượng JavaBean nào cũng có thể được lưu trữ trong Realm nếu nó kế thừ từ lớp RealmObject. JavaBean là gì, chỉ đơn giản một lớp Java đó là serializable, có một constructor mặc định, và có getter/setter cho các biến thành viên của nó.
Ví dụ, lớp Country sau đây có thể dễ dàng lưu trữ trong một Realm:
public class Country extends RealmObject {
private String name;
private int population;
public Country() { }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPopulation() {
return population;
}
public void setPopulation(int population) {
this.population = population;
}
}
Nếu bạn muốn sử dụng một biến thành phần của RealmObject làm khóa chính, bạn có thể sử dụng @PrimaryKey. Ví dụ, để chỉ định biến "code" làm khóa chính trong class Country, bạn làm như sau :
@PrimaryKey
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
4. Tạo transaction
Trong khi đọc dữ liệu từ Realm là rất đơn giản, bạn sẽ thấy trong các bước tiếp theo, ghi dữ liệu vào nó sẽ hơi phức tạp hơn.
Để bắt đầu một transaction, sử dụng phương thức beginTransaction. Tương tự, để kết thúc một transaction, sử dụng phương thức commitTransaction.
Ví dụ, đây là cách bạn tạo và ghi một đối tượng Country.class vào trong cơ sở dữ liệu Realm :
myRealm.beginTransaction();
// Create an object
Country country1 = myRealm.createObject(Country.class);
// Set its fields
country1.setName("Norway");
country1.setPopulation(5165800);
country1.setCode("NO");
myRealm.commitTransaction();
Bạn nhận thấy rằng country1 không được tạo ra thông qua hàm khởi tạo constructor của lớp Country. Để Realm quản lí một đối tượng của RealmObject, đối tượng phải được tạo ra thông qua createObject.
Nếu bạn phải sử dụng contructor, đừng quên sử dụng copyToRealm của Realm trước khi thực hiện các transaction. Đây là ví dụ :
// Create the object
Country country2 = new Country();
country2.setName("Russia");
country2.setPopulation(146430430);
country2.setCode("RU");
myRealm.beginTransaction();
Country copyOfCountry2 = myRealm.copyToRealm(country2);
myRealm.commitTransaction();
5. Truy vấn
Realm cung cấp một API rất trực quan và rõ ràng để tạo các truy vấn. Để tạo một truy vấn, sử dụng "where" của đối tượng Realm và truyền vào đối tượng mà bạn muốn truy vấn.
Sau khi tạo truy vấn xong, bạn có thể sử dụng phương thức findAll để lấy tất cả các kết qủa, trả về dưới dạng RealmResults object.
Trong ví dụ dưới đây, chúng ta sẽ lấy và in ra tất cả các đối tượng của lớp Country :
RealmResults<Country> results1 =
myRealm.where(Country.class).findAll();
for(Country c:results1) {
Log.d("results1", c.getName());
}
// Prints Norway, Russia
Realm cung cấp một số phương thức, chẳng hạn như beginsWith, endsWith, lesserThan và greaterThan, bạn có thể sử dụng chúng để lọc các kết qủa trả về.
Ví dụ đoạn code sau sẽ dùng phương thức greaterThan để lọc các đối tượng Country trả về mà có population lớn hơn 100 triệu :
RealmResults<Country> results2 =
myRealm.where(Country.class)
.greaterThan("population", 100000000)
.findAll();
// Gets only Russia
Nếu bạn muốn kết quả của truy vấn trả về được sắp xếp, bạn có thể sử dụng phương thức findAllSorted :
// Sort by name, in descending order
RealmResults<Country> results3 =
myRealm.where(Country.class)
.findAllSorted("name", false);
// Gets Russia, Norway
Kết luận
Như vậy mình đã hướng dẫn các bạn những thao tác cơ bản để sử dụng Realm trong một project Android : tạo ra một cơ sở dữ liệu Realm, lưu trữ dữ liệu trong nó, và truy vấn nó.
Để hiểu sâu về Realm dùng trong Android, các bạn hãy tham khảo thêm tài liệu trên trang chủ của Realm nhé.
All rights reserved