Cơ sở dữ liệu cõi là cơ sở dữ liệu dành cho thiết bị di động, được xây dựng từ nền tảng cho phép chạy trực tiếp trong điện thoại, bảng máy tính và các thiết bị đeo được
Realm có một slogan rất hay. “cơ sở dữ liệu tốt hơn, nhanh hơn, đơn giản hơn“
Dễ dàng nhận ra các từ “tốt hơn, nhanh hơn và đơn giản hơn” với nghĩa là so sánh giữa Relam và SQLite. Trong khi SQLite vẫn là sự lựa chọn mặc định từ xưa đến nay và vẫn tiếp tục phát triển
Cơ sở dữ liệu Realm trong Android đang hoạt động như thế nào?
Realm active bằng cách lưu các Đối tượng Java trực tiếp vào đĩa thay vì ánh xạ chúng sang một kiểu dữ liệu khác như SQLite đang làm
Vương quốc có thể ánh xạ nhiều loại Đối tượng khác nhau vào một tệp trên đĩa. Hay nói cách khác, Các cõi không có yêu cầu ánh xạ riêng biệt từng đối tượng Java đến phiên bản được lưu trữ trên đĩa
Nó giống với triết lý. “cái bạn thấy là cái được lưu”. Nếu các đối tượng được quản lý bởi Realm bị thay đổi bởi người dùng, nó sẽ tự động được lưu vào cơ sở dữ liệu. Vương quốc quản lý các Đối tượng tương tự như SQLite quản lý các bảng
Để một lớp Java trở thành Realm Managed, Lớp đó phải mở rộng từ RealmObject hoặc triển khai Giao diện RealmModel
Realm database in Android with apps display the language
Để hiểu rõ hơn Realm database trong Android, chúng ta hãy tạo một ứng dụng demo đơn giản. Hiển thị các câu danh ngôn được lưu trong cơ sở dữ liệu sử dụng Realm
Ứng dụng có giao diện kiểu như sau
#1. Cài đặt cơ sở dữ liệu Realm trong Android
Chuyển từ SQLite sang Realm database cũng rất đơn giản. Thêm Realm vào dự án Android mới hoặc dự án Android hiện tại chỉ cần thực hiện các bước sau
Đầu tiên, bạn thêm các phụ thuộc sau khi xây dựng. phân lớp
buildscript { repositories { jcenter[] } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' classpath "io.realm:realm-gradle-plugin:2.3.1" } }
Sau đó, bạn áp dụng plugin
apply plugin: 'com.android.application' apply plugin: 'realm-android'0 vào file build đầu tiên. gradle [trong ứng dụng thẻ]
apply plugin: 'com.android.application' apply plugin: 'realm-android'
Khi thay đổi bản dựng. gradle, bạn nhớ sync lại grade khi Android Studio yêu cầu nhé
🔥 Học cách sử dụng Android Studio chi tiết. Toàn tập cách sử dụng Android Studio
OK, chúng ta đã hoàn thành bước đầu, bước tiếp theo là khởi động nó
#2. Khởi tạo cơ sở dữ liệu Realm database trong Android
Nơi tốt nhất để thực hiện việc khởi động này là trong một lớp mở rộng từ Ứng dụng
Đối với dự án demo, mình thêm một lớp là ProntoQuoteApplication. java
Để khởi động Realm cơ sở dữ liệu, ta làm như sau
public class ProntoQuoteApplication extends Application { @Override public void onCreate[] { super.onCreate[]; if [LeakCanary.isInAnalyzerProcess[this]]{ return; } initRealm[]; } private void initRealm[] { Realm.init[this]; RealmConfiguration config = new RealmConfiguration.Builder[] .name["prontoschool.realm"] .schemaVersion[1] .deleteRealmIfMigrationNeeded[] .build[]; Realm.setDefaultConfiguration[config]; }
Trong đoạn mã trên, mình đã sử dụng RealmConfiguration Object để truyền các tham số đến Realm
Bước này thực ra chỉ là tùy chọn thôi – nếu chúng ta không cấu hình cơ sở dữ liệu thì những thông số mặc định sẽ được sử dụng
#3. Tạo bảng cơ sở dữ liệu Realm
Trong Realm không có bảng khái niệm như SQLite, thay vào đó chúng ta có Realm Managed object
Cụm từ “tạo bảng” được sử dụng chỉ là do sự tương đồng mà thôi. Để tạo bảng hoặc cập nhật các đối tượng tự động, tất cả các lớp mô hình phải được mở rộng từ lớp RealmObject
Trong Realm cũng có thể xây dựng mối quan hệ một – nhiều [1-n]. Ví dụ như app demo trong bài viết này là mối quan hệ giữa. Tác giả và trích dẫn. Một tác giả có thể có nhiều trích dẫn nhưng một trích dẫn thì chỉ có một tác giả
public class Quote extends RealmObject{ @PrimaryKey private long id; private String quote; private Author author; private Category category; private String quoteBackgroundImageUrl; private boolean isFavourite; } public class Author extends RealmObject{ @PrimaryKey private long id; private String authorName; private String authorImageUrl; private RealmList quotes; }
Bây giờ chúng ta có thể lưu các thể hiện của các lớp này trực tiếp vào cơ sở dữ liệu Realm
#4. Việc tạo Khóa chính tự động tăng
Hiện tại, Realm không hỗ trợ khóa chính tự động tăng [auto increment]. Vì sao làm thế nào bây giờ?
Cách workaground đơn giản là chúng ta tăng giá trị khóa chính thủ công. Mình định nghĩa một biến tĩnh [biến tĩnh] kiểu AtomicLong trong ProntoQuoteApplication. java
Khi ứng dụng chạy, mình sẽ kiểm tra các bảng, đối tượng quản lý. Nếu nó đã được tạo, mình sẽ lấy giá trị khóa chính tối đa của đối tượng đó và lưu nó trong biến AtomicLong
Sau đó, mỗi khi muốn lưu một đối tượng vào cơ sở dữ liệu, mình sẽ có khóa chính và tự động tăng giá trị của nó lên rồi sử dụng nó cho lần tiếp theo
Đây là cách thực hiện bằng mã
public class ProntoQuoteApplication extends Application { public static AtomicLong quotePrimaryKey; public static AtomicLong authorPrimaryKey; @Override public void onCreate[] { super.onCreate[]; initRealm[]; } private void initRealm[] { Realm.init[this]; RealmConfiguration configuration = new RealmConfiguration.Builder[] .name[Constants.REALM_DATABASE] .schemaVersion[1] .deleteRealmIfMigrationNeeded[] .build[]; //Now set this config as the default config for your app //This way you can call Realm.getDefaultInstance elsewhere Realm.setDefaultConfiguration[configuration]; //Get the instance of this Realm that you just instantiated //And use it to get the Primary Key for the Quote and Category Tables Realm realm = Realm.getInstance[configuration]; try { //Attempt to get the last id of the last entry in the Quote class and use that as the //Starting point of your primary key. If your Quote table is not created yet, then this //attempt will fail, and then in the catch clause you want to create a table quotePrimaryKey = new AtomicLong[realm.where[Quote.class].max["id"].longValue[] + 1]; } catch [Exception e] { //All write transaction should happen within a transaction, this code block //Should only be called the first time your app runs realm.beginTransaction[]; //Create temp Quote so as to create the table Quote quote = realm.createObject[Quote.class, 0]; //Now set the primary key again quotePrimaryKey = new AtomicLong[realm.where[Quote.class].max["id"].longValue[] + 1]; //remove temp quote RealmResults results = realm.where[Quote.class].equalTo["id", 0].findAll[]; results.deleteAllFromRealm[]; realm.commitTransaction[]; } try { //Attempt to get the last id of the last entry in the Author class and use that as the //Starting point of your primary key. If your Author table is not created yet, then this //attempt will fail, and then in the catch clause you want to create a table authorPrimaryKey = new AtomicLong[realm.where[Author.class].max["id"].longValue[] + 1]; } catch [Exception e] { //All write transaction should happen within a transaction, this code block //Should only be called the first time your app runs realm.beginTransaction[]; //Create temp Author so as to create the table Author author = realm.createObject[Author.class, 0]; //Now set the primary key again authorPrimaryKey = new AtomicLong[realm.where[Author.class].max["id"].longValue[] + 1]; //remove temp author RealmResults results = realm.where[Author.class].equalTo["id", 0].findAll[]; results.deleteAllFromRealm[]; realm.commitTransaction[]; } } }
#5. Mở và đóng Realm Instances
Với SQLite, bạn gọi hàm
apply plugin: 'com.android.application' apply plugin: 'realm-android'1 hoặc
apply plugin: 'com.android.application' apply plugin: 'realm-android'2 nếu muốn tạo một thể hiện của SQLiteDatabase khi truy xuất cơ sở dữ liệu
With Realm, cũng tương tự, bạn gọi
apply plugin: 'com.android.application' apply plugin: 'realm-android'3 để khởi tạo phiên bản của Realm
Tương tự với SQLite, khi bạn kết thúc việc truy xuất vào cơ sở dữ liệu thì nên đóng nó lại để nhớ giải nén
public void onDestroy[] { if [!realm.isClosed[]] { realm.close[]; } super.onDestroy[]; }
#6. Cách thêm dữ liệu vào Realm database trong Android
Để thêm dữ liệu mới vào cơ sở dữ liệu Realm trong Android, bạn sử dụng Realm Managed Object. Để đạt được hiệu quả hơn, các đối tượng này phải được đính kèm trong một giao dịch
Ví dụ, đây là cách để lưu một Trích dẫn vào cơ sở dữ liệu
apply plugin: 'com.android.application' apply plugin: 'realm-android'0
#7. Truy xuất để lấy dữ liệu từ Realm database
Truy vấn lấy dữ liệu trong Realm rất đơn giản và hiệu suất cũng rất tốt
Để truy vấn trong Realm, chúng ta sử dụng Fluent interface để xây dựng các câu truy vấn với nhiều điều kiện khác nhau. Bạn có thể xây dựng truy vấn lệnh bằng String hoặc sử dụng RealmQuery để xây dựng truy vấn lệnh
Kết quả truy vấn lệnh sẽ được trả về dưới dạng
apply plugin: 'com.android.application' apply plugin: 'realm-android'4, trong đó
apply plugin: 'com.android.application' apply plugin: 'realm-android'5 là một lĩnh vực được quản lý
Các đối tượng Realm được chứa trong RealmResult là các đối tượng trực tiếp. Bạn có thể thoải mái đọc các giá trị của bất kỳ đối tượng kỳ lạ nào nhận được. Tuy nhiên, nếu muốn cập nhật thì cần phải thực hiện lại thông tin qua một giao dịch
Mình ví dụ đoạn code truy vấn cơ sở dữ liệu để lấy tất cả các quote
apply plugin: 'com.android.application' apply plugin: 'realm-android'3
#số 8. Trong kiến trúc MVP thì thao tác với Realm sẽ code như thế nào?
Một trong những tính năng mạnh mẽ nhất của Realm database trong Android là tính năng động. Dữ liệu [đối tượng] được tự động cập nhật
Nghĩa là khi một dữ liệu [hay nói cách khác là đối tượng] bị thay đổi, nó lập tức được cập nhật vào đĩa và thông báo cho tất cả người nghe của đối tượng đó. Đây lại là một vấn đề khi muốn áp dụng một kiến trúc như MVP khi sử dụng Realm
Lý do là mỗi khi cập nhật vào Realm Managed lại cần một giao dịch. Nghĩa là bạn sẽ phải code việc cập nhật này trong Activity hay Fragment. Mà với MVP model, thì người ta lại muốn tách phần Model [thao tác với cơ sở dữ liệu] ra khỏi phần View[Activity/Fragment]
Tuy nhiên, is not must be no way. Mình sẽ phải cập nhật các đối tượng thủ công, thông qua các giao diện. Các bạn tham khảo đoạn mã bên dưới
apply plugin: 'com.android.application' apply plugin: 'realm-android'4
Với các giao diện trên, đây là cách mình lưu Tác giả vào cơ sở dữ liệu
apply plugin: 'com.android.application' apply plugin: 'realm-android'5
Với kiến trúc MVP, tầng View tốt nhất là không cần quan tâm đến phía bên dưới sử dụng SQLite hay Realm. Như thế mới phát huy hết sức mạnh của kiến trúc MVP
🔥 Đọc thêm. Explosion model MVP for setting Android application
Cuối cùng, các bạn có thể tham khảo toàn bộ mã nguồn của mình và xem ứng dụng chạy như thế nào nhé.
ĐẦY ĐỦ MÃ NGUỒN
Như vậy, mình đã hoàn thành bài viết hướng dẫn cơ bản về Realm database trong Android. Hi vọng các bạn sẽ cảm thấy bài viết có ích
Nếu có bất kỳ thắc mắc gì thì hãy comment bên dưới nhé
Nhận sách Các tính năng nâng cao của Java
Java là ngôn ngữ lập trình biến thế giới phổ biến nhất, là hình mẫu của tư tưởng OOP. Nếu bạn muốn bắt đầu với Java thì đây là cuốn sách không thể bỏ qua. Với 63 ví dụ thực thi, cùng với cách viết ngắn gọn dễ hiểu sẽ giúp bạn hiểu rõ bản chất của Java
Hiện Amazon đang bán với giá 16$, nhưng với VNTALKING thì miễn phí cho bạn. Còn chờ gì nữa?
- THẺ
- Tự học lập trình android
liên kết
Bài trước Bỏ từ khóa other trong hàm if. Có nên không?
Bài tiếp theo 5 lỗi thường gặp khi thiết lập trình Android
sơn dương
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường đúng là xin được làm đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé